事务传播机制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()方法,只有经过此处,才能对事务进行控制。

解决方法:需要将两个方法分别写在不同的类里。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值