事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

时间:2024-05-20 17:55:59

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

继续进入

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

 

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

在创建代理对象时传递了目标对象taget,

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

在用cglib创建代理对象时,仍传过去了target

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

最终返回的enhancer代理对象,如下图示,仍含有目标对象taget实例(这就解释了目标对象的自我调用 Propagation.REQUIRES_NEW 不会起作用的 )

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强,即进入目标方法之前开启事务,退出目标方法时提交/回滚事务。

目标对象内部的自我调用将无法实施切面中的增强。

借个图(https://blog.****.net/hepei120/article/details/78058468?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase

事务启动bean的处理(Propagation.REQUIRES_NEW不生效的原因)

此处的this指向目标对象,因此调用this.b()将不会执行b事务切面,即不会执行事务增强,因此b方法的事务定义“@Transactional(propagation = Propagation.REQUIRES_NEW)”将不会实施

解决方法 
1:不要做内部调用 ,用a,b方法用俩个类分开写,不要写在同一个类里

2,或者在类内部autoweired自己,A{

     autowired A a;

@Transactional(propagation = Propagation.REQUIRED)

m1()

{

a.m2();//这样也会使REQUIRES_NEW生效

};

@Transactional(propagation = Propagation.REQUIRES_NEW)

m2();

}