spring事务内部调用问题

2019-07-10  本文已影响0人  远行的夜色

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(){
           }
上一篇 下一篇

猜你喜欢

热点阅读