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


文章插图

Spring事务传播行为实战

文章插图
总结父方法无事务,子方法开启新事务父方法有事务,子方法和父方法共用一个事务(无论父、子方法报错,整体回滚)
2、SUPPORTS2.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.SUPPORTS) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法报错"); }结果:数据都插入成功
Spring事务传播行为实战

文章插图
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); }

经验总结扩展阅读