同一个类中调用方法spring事务注解@Transactional如何生效?

要解答这个问题,要分两步走:

  • 同一个类中,方法A调用方法B,为什么会导致@Transactional事务失效
  • 如何避免事务失效

事务失效原因

我们先来看一个正常的依赖注入。

InjectTest注入了MyServiceImpl,可以调用MyServiceImpl#doSomething()。

但是,当我们给MyServiceImpl#doSomething()加上@Transactional注解后:

myServiceImpl的对象变成了MyServiceImpl <math xmlns="http://www.w3.org/1998/Math/MathML"> E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB </math>EnhancerBySpringCGLIB9f78d9e5@5810,很明显是Spring通过CGLIB代理出来的对象。也就是说,InjectTest此时注入的是代理对象,而代理对象内部持有target目标对象。

本次方法调用最终会到达目标对象,也就是真正的MyServiceImpl:

整个过程类似这样:

左边代理对象,右边目标对象,调用代理对象,最终会委托到目标对象。

回到我们的问题:同一类中A方法调用B方法为什么会导致事务失效呢?

因为在add方法中通过this.sub()调用时,本质上根本不会走代理对象的逻辑,而目标对象内部并不存在事务相关的增强逻辑。

解决办法

知道原因后,就很好解决了。最简单的方法是使用AopContext获取实际的代理对象。

那么,怎么在目标对象中获取到实际的代理对象proxy呢?

Spring提供了AopContext。

开启exposeProxty=true以后,Spring会在AopContext中共享当前代理对象(本质是在本次请求中通过ThreadLocal共享代理对象)。

具体代码是:

开源项目:

相关推荐
编程修仙14 分钟前
第五篇 SpringMVC
java·spring boot·spring
Hui Baby20 分钟前
Mq扩充队列提高并发
开发语言·后端·ruby
星月昭铭26 分钟前
Spring AI使用JSON Schema导致模型调用速度极慢
java·spring·ai·json
梦子yumeko31 分钟前
Spring Ai Alibaba-1.1.0.0-M5-SequentialAgent
java·人工智能·spring
程序员爱钓鱼34 分钟前
Node.js 编程实战:全面理解异步错误处理
后端·node.js·trae
IT_陈寒38 分钟前
从混乱到优雅:这5个现代JavaScript技巧让你的代码性能提升50%
前端·人工智能·后端
qq_3482318540 分钟前
完整的 Spring Boot + Redisson 分布式锁示例
spring boot·分布式·后端
m0_7400437341 分钟前
SpringMVC/Spring Boot 控制器返回视图路径(相对 / 绝对路径)核心总结
java·spring boot·后端·spring
程序员爱钓鱼43 分钟前
Node.js 编程实战深入理解Promise与async&await
后端·node.js·trae
0和1的舞者1 小时前
《Spring Bean&DI 通关笔记:从定义到注入的全场景避坑指南》
java·开发语言·学习·spring·ioc·di·web