今天又有一个同事来问,为什么他的spring事务没有生效?该有的配置,annotation全有了,为什么数据插入不进去呢。
看了一眼代码,发现是个老问题,已经不止一个人掉这个坑里了,所以总结一下。
场景:
@Service class Service { void a() { ... b(); ... } @Transaction void b() { ... } }class Controller {
@Autowired
Service s;void f() { s.a(); }
}
上述代码的事务是不会生效的。spring 的事务和其它 aop 原理都是动态代理或字节码修改生成一个代理类,由代理类进行事务的开启和提交。
形象的说,上述代码产生了一个 实体 Service _s, 一个代理 Service _proxy_s, 注入给 Controller 的实际上是_proxy_s.
当我们在调用 s.a 时,实际调用了_proxy_s.a(), 它发现 a 方法不需要事务, 因此代理类不进行任何处理,其内部直接调用了 _s.a(), 后续调用了 _s.b(). 这时 @Transaction 不会起任何作用。
只有调用_proxy_s.b(),事务才会起作用。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于