文章插图
2.2、父方法开启事务 , 子方法开启事务,子方法报错 @Transactional 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.SUPPORTS) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:两表数据都回滚了
文章插图
文章插图
总结如果当前不存在事务,就以非事务执行如果当前存在事务,就加入该事务
3、MANDATORY3.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.MANDATORY) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation ‘mandatory’3.2、父方法开启事务,子方法开启事务,子方法报错
@Transactional 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.MANDATORY) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:两表数据都回滚了文章插图
文章插图
总结如果当前不存在事务,就抛出异常如果当前存在事务,就加入该事务
4、REQUIRES_NEW4.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.REQUIRES_NEW) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:ks_a数据插入成功,ks_b数据回滚文章插图
文章插图
4.2、父方法开启事务,子方法开启事务,父方法报错
@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.REQUIRES_NEW) public void insert(KsB ksB) {ksBDao.insert(ksB); }
结果:ks_a数据回滚,ks_b数据插入成功文章插图
文章插图
总结无论当前存不存在事务 , 都创建新事务
5、NOT_SUPPORTED5.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.NOT_SUPPORTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:数据都插入成功文章插图
文章插图
5.2、父方法开启事务,子方法开启事务,子方法报错
@Transactional 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.NOT_SUPPORTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }
结果:ks_a数据回滚,ks_b数据插入成功文章插图
文章插图
总结以非事务方式执行,如果当前存在事务,父方法以事务方式执行,子方法以非事务方式执行
6、NEVER父方法开启事务,子方法开启事务
@Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insert(ksB); }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 四十八 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-使用第三方UI框架
- Spring Retry 重试
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
- 装配 SpringBoot自动配置流程
- Seata 环境搭建
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- SpringCloud怎么迈向云原生?
- Filter Spring中过滤器和拦截器(Interceptor)的区别和联系
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 二 【SSM】学习笔记——SpringMVC入门