spring 类中方法互相调用 事务失效

同一个类中的方法互相调用,导致配置的事务失效。

例如: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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值