当前位置:   article > 正文

@Transactional 注解失效的几种情况_transactional注解失效

transactional注解失效

第一种
Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用。

第二种
在类内部调用调用类内部@Transactional标注的方法。这种情况下也会导致事务不开启。

既然事务管理是基于动态代理对象的代理逻辑实现的,那么如果在类内部调用类内部的事务方法,这 个调用事务方法的过程并不是通过代理对象来调用的,而是直接通过this对象来调用方法,绕过的代理对 象,肯定就是没有代理逻辑了。

解决方法
1.可以在service层 注入自己 用自己调用方法 或者
2.新建一个service 通过注入新建的service调用方法
3.可以通过编程式事务管理 TransactionTemplate

@Autowired
   private TransactionTemplate transactionTemplate;
   
   ...
   
   public void save(final User user) {
         queryData1();
         queryData2();
         transactionTemplate.execute((status) => {
            addData1();
            updateData2();
            return Boolean.TRUE;
         })
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
4.在该Service类中使用AopContext.currentProxy()获取代理对象
  • 1
@Servcie
  publicclass ServiceA {
  
     public void save(User user) {
           queryData1();
           queryData2();
           ((ServiceA)AopContext.currentProxy()).doSave(user);
     }
     
     @Transactional(rollbackFor=Exception.class)
     public void doSave(User user) {
         addData1();
         updateData2();
      }
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

第三种
事务方法内部捕捉了异常,没有抛出新的异常,导致事务操作不会进行回滚。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/224705
推荐阅读
相关标签
  

闽ICP备14008679号