@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;
         })
   }
4.在该Service类中使用AopContext.currentProxy()获取代理对象
@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();
      }
   }

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

你可能感兴趣的:(spring,spring)