Spring事务传播行为实战( 二 )


文章插图
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("子方法报错"); }结果:两表数据都回滚了

Spring事务传播行为实战

文章插图
Spring事务传播行为实战

文章插图
总结如果当前不存在事务,就以非事务执行如果当前存在事务,就加入该事务
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("子方法报错"); }结果:两表数据都回滚了
Spring事务传播行为实战

文章插图
Spring事务传播行为实战

文章插图
总结如果当前不存在事务,就抛出异常如果当前存在事务,就加入该事务
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数据回滚
Spring事务传播行为实战

文章插图
Spring事务传播行为实战

文章插图
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数据插入成功
Spring事务传播行为实战

文章插图
Spring事务传播行为实战

文章插图
总结无论当前存不存在事务 , 都创建新事务
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("子方法报错"); }结果:数据都插入成功
Spring事务传播行为实战

文章插图
Spring事务传播行为实战

文章插图
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数据插入成功
Spring事务传播行为实战

文章插图
Spring事务传播行为实战

文章插图
总结以非事务方式执行,如果当前存在事务,父方法以事务方式执行,子方法以非事务方式执行
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); }

推荐阅读