继续进入
在创建代理对象时传递了目标对象taget,
在用cglib创建代理对象时,仍传过去了target
最终返回的enhancer代理对象,如下图示,仍含有目标对象taget实例(这就解释了目标对象的自我调用 Propagation.REQUIRES_NEW 不会起作用的 )
首先调用的是AOP代理对象而不是目标对象,首先执行事务切面,事务切面内部通过TransactionInterceptor环绕增强进行事务的增强,即进入目标方法之前开启事务,退出目标方法时提交/回滚事务。
目标对象内部的自我调用将无法实施切面中的增强。
此处的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();
}