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

结果: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); } @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数据回滚
Spring事务传播行为实战

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

文章插图
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("子方法报错"); }结果:数据都回滚
Spring事务传播行为实战

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

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

经验总结扩展阅读