事务传播机制REQUIRES_NEW,在嵌套事务中不起作用的解决方法
事务传播机制REQUIRES_NEW的官方文档中是这样解释的:
Create a new transaction, and suspend the current transaction if one exists.
翻译为创建一个新事务,如果当前存在事务,则挂起当前存在的事务。
总结下REQUIRES_NEW有两层含义:
1.REQUIRES_NEW会开启新事务,外层事务不会影响内层事务的提交和回滚操作
2.REQUIRES_NEW如果内层事务出现异常,则外层事务也会同样进行回滚操作
今天下午写了一个Demo测试了下如果外层事务出现异常,采用REQUIRES_NEW标记的内层事务是否会回滚
理想结果:外层事务发生异常,采用REQUIRES_NEW标记的内层事务正常提交不会回滚,外层事务数据库进行回滚操作
测试结果:内层事务外层事务都进行了回滚操作!
很明显自己的测试结果是错误的,最后通过排查以及测试发现是自己将外层方法和内层方法写在一个service类中
在经过Debug代码之后发现了org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor中的intercept()方法
在同一个Service中:
在不同的Service中:
org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept()方法,只有经过此处,才能对事务进行控制。
解决方法:需要将两个方法分别写在不同的类里。