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

结果:数据都回滚

Spring事务传播行为实战

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

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

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

文章插图
总结如果当前没有事务,则新开事务执行如果当前存在事务,则在嵌套事务内执行
四、结论1、NESTED和REQUIRES区别区别在于:如果当前存在事务,子方法抛异常时NESTED在父方法可以选择捕获子方法,父方法数据不会回滚;REQUIRES无论捕不捕获,父方法数据都回滚
2、NESTED和REQUIRES_NEW区别区别:如果当前存在事务,父方法抛异常时NESTED数据回滚,REQUIRES也是如此REQUIRES_NEW数据不回滚
3、七种传播行为总结说明:加入该事务,指的是父、子方法共用一个事务(无论父、子方法报错,整体回滚)
REQUIRED父方法无事务,子方法开启新事务父方法有事务,就加入该事务
SUPPORTS如果当前不存在事务,就以非事务执行如果当前存在事务,就加入该事务
MANDATORY如果当前不存在事务,就抛出异常如果当前存在事务,就加入该事务
REQUIRES_NEW无论当前存不存在事务,都创建新事务
NOT_SUPPORTED以非事务方式执行,如果当前存在事务,父方法以事务方式执行,子方法以非事务方式执行
NEVER以非事务方式执行,如果当前存在事务,则抛出异常
NESTED如果当前没有事务,则新开事务执行如果当前存在事务,则在嵌套事务内执行
 【Spring事务传播行为实战】

经验总结扩展阅读