Spring 事务失效场景:this 调用导致事务不生效的原因及解决方案
Spring 事务管理中 this 调用事务方法不生效的情况
原因概述:
在 Spring 中,事务管理是通过代理对象实现的。当在类内部使用 this 调用自身的带有 @Transactional 注解的方法时,实际上绕过了 Spring 的代理对象,导致事务拦截器无法触发,从而事务不生效。
错误示例:
1 |
|
在这个示例中,由于 outerMethod 中通过 this 直接调用了 innerMethod,Spring 事务不会生效,因为 this 调用不会走代理对象。
正确示例:
- 使用 Spring 容器中的代理对象:
1 |
|
- 使用
AopContext获取代理对象:
1 | import org.springframework.aop.framework.AopContext; |
- 将事务方法移到另一个类:
1 |
|
总结:
- Spring 的事务管理依赖代理对象来实现,因此直接使用
this调用自身方法无法触发事务逻辑。 - 解决办法有:
- 通过 Spring 容器获取代理对象进行调用。
- 使用
AopContext.currentProxy()获取当前代理对象。 - 将事务方法移到另一个类中调用。
这样可以确保事务注解的正确执行,避免因为使用 this 而导致事务不生效的问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ChenPi's Blog!
评论
TwikooGiscus





