spring事务内部调用问题:
在spring内部调用可能会存在事务失效的问题,主要是spring事务是通过代理模式实现的,在一个service里面如果
方法A(未开启事务)调用方法B(有事务注解@Transactional)时方法B的事务是不起作用的,这种情况是因为方法A未开启
事务没有触发代理,在内部调用方法B,this.B()这种调用,也不会触发代理对象去增强B方法,结果就是方法B事务失效。
解决类似的问题有以下几种办法:
1.在方法A上面开启注解事务@Transactional
@Transactional(rollbackFor = Exception.class)
public void A(){
this.B();
}
2.如果有aop切面配置的方式, 可以在Service层新建个ServiceImpl类
然后在方法A中调用B的方法逻辑即可,这种方式每次需要新建类
3.如果是xml配置,可以以下方式:
<--将代理暴露出来-->
<aop:aspectj-autoproxy expose-proxy="true" />
this.B()------>((AService)AopContext.currentProxy()).B();即可。
public void A(){
((AService)AopContext.currentProxy()).B();
}
// 方法B上面开启事务
@Transactional(rollbackFor = Exception.class)
public void B(){
}
4.springboot方式:
启动类上配置: @EnableAspectJAutoProxy(exposeProxy = true)
public void A(){
((AService)AopContext.currentProxy()).B();
}
// 方法B上面开启事务
@Transactional(rollbackFor = Exception.class)
public void B(){
}
网友评论