package com.example.demoge.controller;
import com.example.demoge.service.TCouponInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zengqifeng
* @Description:
* @date 2020/8/29
*/
@RestController
@RequestMapping("/transactionalTest")
@Api(tags = "事务传播级别及非事务方法和事务方法之间的互相调用")
public class TransactionalTestController {
@Autowired
private TCouponInfoService tCouponInfoService;
/**
* 测试非事务方法调用事务方法 是否会启动事务
* 同一个service
* 1、非事务方法调用事务方法 没有开启事务
* 2、事务方法调用事务方法(默认传播级别) 两个方法全部回滚(在同一个事务中)
* 3、事务方法调用非事务方法 两个方法全部回滚(在同一个事务中)
* 总结:
* 1、同一个service不存在事务的传播级别 因为下层被调用方法根本不会开启事务
* 2、同一个service 一个方法(事务或非事务)调用另一个事务方法
* 第二个事务方法没有代理对象为其生成事务,所以不会开启事务,也不会有事务传播级别的这样说法
*
* 不同service
* 1、非事务方法调用事务方法 第二个方法(其他service的方法)开启了事务
* 2、事务方法调用事务方法(默认传播级别) 两个方法全部回滚(在同一个事务中)
* propagation = Propagation.REQUIRES_NEW
* 1、全部开启新事物
* 2、内部事务出现异常 回滚 会导致外部事务也回滚
* 3、内部事务提交后 及时外部事务出现异常回滚,但并不会导致内部事务的回滚
* 3、事务方法调用非事务方法 两个方法全部回滚(在同一个事务中)
* 总结:事务传播级别有效的前提是 方法事务被开启
* 被调用方事务传播行为有效的前提是 存在调用方
*
* @return
*/
@ApiOperation("新增/编辑券信息")
@PostMapping("testTransactional")
public Object testTransactional() {
return tCouponInfoService.testTransactional();
}
}
package com.example.demoge.service.impl;
import com.baomidou.mybatisplus.plugins.Page;
import com.example.demoge.entity.TCouponInfo;
import com.example.demoge.mapper.TCouponInfoMapper;
import com.example.demoge.service.TCouponApplyDetailService;
import com.example.demoge.service.TCouponInfoService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 优惠券基础信息表 服务实现类
* </p>
*
* @author zengqifeng
* @since 2020-08-03
*/
@Service
public class TCouponInfoServiceImpl extends ServiceImpl<TCouponInfoMapper, TCouponInfo> implements TCouponInfoService {
@Autowired
private TCouponInfoMapper tCouponInfoMapper;
@Autowired
private TCouponApplyDetailService tCouponApplyDetailService;
@Override
public TCouponInfo demo(Integer id) {
TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(id);
tCouponInfoMapper.selectList(null);
return tCouponInfo;
}
@Override
public List<TCouponInfo> selectPageList(Page page) {
return tCouponInfoMapper.selectPageList(page);
}
/**
* 测试非事务方法调用事务方法 是否会启动事务
* 同一个service
* 1、非事务方法调用事务方法 没有开启事务
* 2、事务方法调用事务方法(默认传播级别) 两个方法全部回滚(在同一个事务中)
* 3、事务方法调用非事务方法 两个方法全部回滚(在同一个事务中)
* 总结:
* 1、同一个service不存在事务的传播级别 因为下层被调用方法根本不会开启事务
* 2、同一个service 一个方法(事务或非事务)调用另一个事务方法
* 第二个事务方法没有代理对象为其生成事务,所以不会开启事务,也不会有事务传播级别的这样说法
*
* 不同service
* 1、非事务方法调用事务方法 第二个方法(其他service的方法)开启了事务
* 2、事务方法调用事务方法(默认传播级别) 两个方法全部回滚(在同一个事务中)
* propagation = Propagation.REQUIRES_NEW
* 1、全部开启新事物
* 2、内部事务出现异常 回滚 会导致外部事务也回滚
* 3、内部事务提交后 及时外部事务出现异常回滚,但并不会导致内部事务的回滚
* 3、事务方法调用非事务方法 两个方法全部回滚(在同一个事务中)
* @return
*/
@Override
@Transactional
public Object testTransactional() {
TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(125);
tCouponInfo.setId(null);
tCouponInfo.setCouponCategoryCode(tCouponInfo.getCouponCategoryCode() + "001");
//外部事务
tCouponInfoMapper.insert(tCouponInfo);
//insert();
//内部事务
tCouponApplyDetailService.inserttest();
//外部事务 会跑出异常 某个字段值重复
tCouponInfoMapper.insert(tCouponInfo);
return null;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insert() {
TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(125);
tCouponInfo.setId(null);
tCouponInfo.setCouponCategoryCode(tCouponInfo.getCouponCategoryCode() + "002");
tCouponInfoMapper.insert(tCouponInfo);
throw new RuntimeException("故意跑出异常");
}
}
package com.example.demoge.service.impl;
import com.example.demoge.entity.TCouponApplyDetail;
import com.example.demoge.entity.TCouponInfo;
import com.example.demoge.mapper.TCouponApplyDetailMapper;
import com.example.demoge.mapper.TCouponInfoMapper;
import com.example.demoge.service.TCouponApplyDetailService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 优惠券申请详情表 服务实现类
* </p>
*
* @author zengqifeng
* @since 2020-08-03
*/
@Service
public class TCouponApplyDetailServiceImpl extends ServiceImpl<TCouponApplyDetailMapper, TCouponApplyDetail> implements TCouponApplyDetailService {
@Autowired
private TCouponInfoMapper tCouponInfoMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void inserttest() {
TCouponInfo tCouponInfo = tCouponInfoMapper.selectById(125);
tCouponInfo.setId(null);
tCouponInfo.setCouponCategoryCode(tCouponInfo.getCouponCategoryCode() + "002");
tCouponInfoMapper.insert(tCouponInfo);
}
}
版权声明:本文为zengqifeng1997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。