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

继续进入

 

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

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

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

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

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

借个图(https://blog.csdn.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

è¿éåå¾çæè¿°

此处的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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值