@Transactional(propagation = Propagation.NEVER) public void insert(KsB ksB) {ksBDao.insert(ksB); }
结果:org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation ‘never’
总结以非事务方式执行 , 如果当前存在事务,则抛出异常
7、NESTED7.1、父方法无事务 , 子方法开启事务,子方法报错 public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insertError(ksB); }
@Transactional(propagation = Propagation.NESTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:ks_a数据插入成功,ks_b数据回滚

文章插图

文章插图
7.2、父方法开启事务,子方法开启事务,子方法报错
@Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insertError(ksB); }
@Override @Transactional(propagation = Propagation.NESTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:数据都回滚
文章插图

文章插图
7.3、父方法开启事务,子方法开启事务,父方法报错
@Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insert(ksB);throw new RuntimeException("主方法报错"); }
@Transactional(propagation = Propagation.NESTED) public void insert(KsB ksB) {ksBDao.insert(ksB); }
结果:数据都回滚
文章插图

文章插图
7.4、父方法开启事务 , 子方法开启事务,子方法报错,父方法并捕获
@Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);try {KsB ksB = new KsB();ksB.setAge(10);ksBService.insertError(ksB);} catch (Exception e) {//dosomething} }
@Transactional(propagation = Propagation.NESTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:ks_a数据插入成功,ks_b数据回滚
文章插图

文章插图
总结如果当前没有事务,则新开事务执行如果当前存在事务,则在嵌套事务内执行
四、结论1、NESTED和REQUIRES区别区别在于:如果当前存在事务,子方法抛异常时NESTED在父方法可以选择捕获子方法,父方法数据不会回滚;REQUIRES无论捕不捕获 , 父方法数据都回滚
2、NESTED和REQUIRES_NEW区别区别:如果当前存在事务,父方法抛异常时NESTED数据回滚 , REQUIRES也是如此REQUIRES_NEW数据不回滚
3、七种传播行为总结说明:加入该事务,指的是父、子方法共用一个事务(无论父、子方法报错 , 整体回滚)
REQUIRED父方法无事务,子方法开启新事务父方法有事务 , 就加入该事务
SUPPORTS如果当前不存在事务,就以非事务执行如果当前存在事务,就加入该事务
MANDATORY如果当前不存在事务 , 就抛出异常如果当前存在事务,就加入该事务
REQUIRES_NEW无论当前存不存在事务 , 都创建新事务
NOT_SUPPORTED以非事务方式执行,如果当前存在事务 , 父方法以事务方式执行,子方法以非事务方式执行
NEVER以非事务方式执行 , 如果当前存在事务 , 则抛出异常
NESTED如果当前没有事务,则新开事务执行如果当前存在事务,则在嵌套事务内执行
【Spring事务传播行为实战】
推荐阅读
- 四十八 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-使用第三方UI框架
- Spring Retry 重试
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
- 装配 SpringBoot自动配置流程
- Seata 环境搭建
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- SpringCloud怎么迈向云原生?
- Filter Spring中过滤器和拦截器(Interceptor)的区别和联系
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 二 【SSM】学习笔记——SpringMVC入门