同一个类中的方法互相调用,导致配置的事务失效。
例如:class ServiceA {
@Transactional(propagation=Propagation.REQUIRED)
public methodA(){
this.methodB();
}
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false)
public methodB(){
}
methodA中直接通过this调用methodB,就会导致methodB配置的requires_new的事务失效,而加入methodA配置的事务。要解决此问题,必先搞清楚动态代理的原理。
代理就是对原有对象生成代理,控制原有对象方法的调用。动态代理,就是在运行时生成代理对象。methodA通过this调用methodB,这里的this就是原有对象,要想methodB配置的事务能生效,必须通过代理对象去调用。
方法1:context.getBean(ServiceA.class)。因ServiceA含有Transactional注解,容器生成的bean就是代理对象。
方法2:通过如下方式调用:((ServiceA)AopContext.currentProxy()).methodB()
注意,要设置<aop:aspectj-autoproxy expose-proxy="true"></aop:aspectj-autoproxy>