spring声明式事务 同一类内方法调用事务失效
在项目开发中,检查代码流程时,被boss指出了一个潜在问题的代码
@Override
public void closeCharge(String payNo){
logger.info("--------------------执行充值结算------------------------");
LsIdCharge idCharge = lsIdChargeService.selectOne(
new EntityWrapper<LsIdCharge>()
.eq(LsIdCharge.PAY_NO, payNo)
);
//此处调用了本类的声明事务的方法
closeCharge(idCharge);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void closeCharge(LsIdCharge idCharge){
logger.info("--------------------充值结算记录未结算 执行插入操作------------------------");
//执行代码。。。。。
}
这里在同一个类中的方法调用另一个带有事务注解的方法,在这种情况下由于代理模式下会导致事务功能失效,这主要是在同一个目标对象中调用内部方法时无法通过代理对象这一层,从而导致增强通知无法起作用。。。(详细参考链接1 详细参考链接2)
解决方法:
- 可以再外层方法加上
@Transactional
- 分成两个类
- 主动用代理类对象调用内部方法(开启CGlib)
我在这里使用的是最后一种方法:
@Override
public void closeCharge(String payNo) throws Exception{
logger.info("--------------------执行充值结算------------------------");
LsIdCharge idCharge = lsIdChargeService.selectOne(
new EntityWrapper<LsIdCharge>()
.eq(LsIdCharge.PAY_NO, payNo)
);
//防止事务注解失效
((OrderServiceImpl)AopContext.currentProxy()).closeCharge(idCharge);
//closeCharge(idCharge);
}