@Transactional注解事务失效总结

情况一

同一类中无@Transactional事务方法调用有@Transactional注解的方法,事务失效。

分析原因:

AopUtils.isAopProxy(AopContext.currentProxy())
AopUtils.isCglibProxy(AopContext.currentProxy())

使用上面方式判断方法是否走代理,发现并没有。

失效原因:同一类中无事务方法调用有事务控制的方法,使得有事务控制的方法执行在非代理类中,导致事务失效。

解决方案:

1、将事务控制的方法放在一个新类中再进行调用。

2、使用((XxxService)AopContext.currentProxy()).doSoming();获取代理来调用事务控制的方法。

情况二

同一类中有@Transactional注解的方法调用有@Transactional注解的方法(嵌套事务),事务失效。

分析原因:经过很长时间的排查,发现是一个低级错误。

失效原因:外层方法被声明为protected

解决方案:将protected改成public

你可能感兴趣的:(@Transactional注解事务失效总结)