赞
踩
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); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。