美文网首页
spring事务内部调用问题

spring事务内部调用问题

作者: 远行的夜色 | 来源:发表于2019-07-10 10:24 被阅读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(){
               }
    

    相关文章

      网友评论

          本文标题:spring事务内部调用问题

          本文链接:https://www.haomeiwen.com/subject/osdckctx.html