1. 程式人生 > >註解@Transactional 不起作用的非配置問題

註解@Transactional 不起作用的非配置問題

在Spring + Mybatis的專案中,發現如下情況,processDB本來是private, 但為了Transactional 特改為public ,外部只調用 process1. 此時事務不起作用。
@Component("aclass")
public class Aclass{
      @Resource(name="testDao")
      private TestDao;
      public void process1(){
           try{
              processDB();
           } catch(Exception){}
       }
       @Transactional 
       public void processDB(){
           testDao.insert();
           testDao.get();
           testDao.update();
           ........
      }
}
後來測試後,發現 把 @Transactional 放到 process1的上面,事務就有效果了,而且 processDB 改為私有也沒問題。如下:
@Component("aclass")
public class Aclass{
    @Resource(name="testDao")
    private TestDao testDao;
    @Transactional
    public void process1(){
    try{
       processDB();
    } catch(Exception){}
    }
    private void  processDB(){
    testDao.insert();
        testDao.get();
        testDao.update();
        ........
    }
}
此時又發現由於 process1中對catch攔截了,因此事務雖然生效,但是由於攔截了catch,造成異常後不回滾事務。
因為在process1中需要攔截 catch並且不丟擲,結合 Transactional 似乎只在一個類的最頂層方法有效。為了解決此問題。建立了一個新類專門處理 Transactional的處理。
最終如下:
@Component("aclass")
public class Aclass{
    @Resource(name="bclass")
    private Bclass bclass
    @Transactional
    public void process1(){
       try{
           bclass.processDB();
       } catch(Exception){}
    }
}
@Component("bclass")
public class Bclass{
    @Resource(name="testDao")
    private TestDao testDao     
    @Transactional
    public void  processDB(){
       testDao.insert();
       testDao.get();
       testDao.update();
           ........
    }
}