无事务的方法调用有事务的方法 最后有事务的那个方法不起效:

Insert3无事务 调用的insert2有事务的 最后数据没有回滚 !!
1、PROPAGATION_REQUIRED
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务

Insert5调用insert4时候 5里面出现异常 4 和5的都不起效果 数据都回滚了,单独调用4是可以成功的。
2、PROPAGATION_SUPPORTS
如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行

单独调用6方法时候 事务不会回滚 操作数据成功
调用7方法时候,6和7方法都回滚,操作失败
3、PROPAGATION_MANDATORY
如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

单独运行8方法时候,数据操作失败,抛出异常

单独运行9方法时候,因为9有异常 最后都回滚 事务有效

然后将异常方法去掉,int a = 10/0 去掉,运行都成功,数据插入成功
4、PROPAGATION_REQUIRES_NEW
使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作为事务管理器。 它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起

单调10方法 执行成功 开启新事务

调用11方法,11方法调用this本对象的10方法,发现最后都回滚了,样子起的效果和默认required一样的。


当跨service调用方法时候,效果起效了。如图,将TransactionTest1中insert11方法调用TransactionTest2中的insert10方法时候,TransactionTest2中的insert10方法被标注了REQUIRES_NEW,此时insert10方法正常执行提交,insert11方法的事物被挂起,当insert10方法执行完成提交事物后,insert11方法事物继续执行,此时遇到异常,insert11的事物被回滚。

第二种情况:被调用t2中insert10方法中出现异常,t1中insert11方发正不跑异常,当insert11调用insert10时候,结果发现,里外事物都被回滚了


内层PROPAGATION_REQUIRES_NEW修饰的事物出现异常抛出,外层调用的事物检测出异常,进行正常的回滚(被调用方法异常没有被catch 往外抛送了)。如果内层异常被catch住了,内外事物都提交了。
备注:为何PROPAGATION_REQUIRES_NEW传播机制对于同个service使用时候,不作出相应的效果,而是和required一样的效果?
结论:spring的事物需要代理对象才能完成。当同一个类里面的insert11方法调用insert10方法没有起到挂起事物的效果,是因为insert11方法里面是用同对象this调用insert10方法,也就是说,调用insert10方法时候,并没再次生成一个代理类,相当于insert10上面的事物注解就被当做不存在,于是这个insert10方法加入到了insert11的事物里面。而当不同service调用时候,被调用的t2类中insert10方法是通过注入代理调用的,所以它起效果了。
文章转载自辉哥的菜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





