1. 程式人生 > >Spring中丟擲異常時,既要要返回錯誤資訊,還要做事務回滾

Spring中丟擲異常時,既要要返回錯誤資訊,還要做事務回滾

情況一:如果沒有在程式中手動捕獲異常,如下程式碼事務會回滾

Java程式碼  收藏程式碼
  1. @Transactional(rollbackFor = { Exception.class })    
  2. public void test() throws Exception {    
  3.      doDbStuff1();    
  4.      doDbStuff2();//假如這個操作資料庫的方法會丟擲異常,方法doDbStuff1()對資料庫的操作會回滾。    
  5. }  

        如果doDbStuff2()方法丟擲異常,方法doDbStuff1()對資料庫的操作會回滾。  

情況二:如果在程式中自已捕獲異常未往外拋,如下程式碼事務不會回滾

Java程式碼  收藏程式碼
  1. @Transactional(rollbackFor = { Exception.class })    
  2. public void test() {    
  3.      try {    
  4.         doDbStuff1();    
  5.         doDbStuff2();//假如這個操作資料庫的方法會丟擲異常,現在方法doDbStuff1()對資料庫的操作  不會回滾。    
  6.      } catch (Exception e) {    
  7.            e.printStackTrace();       
  8.      }    
  9. }  

        如果doDbStuff2()這個操作資料庫的方法丟擲異常,因為將異常捕獲未往外拋,方法doDbStuff1()對資料庫的操作不會回滾。

情況三:如果自己需要捕獲異常又要返回錯誤時,可以參考以下做法

Java程式碼  收藏程式碼
  1. @Transactional(rollbackFor = { Exception.class })    
  2. public void test() {    
  3.      try {    
  4.         doDbStuff1();    
  5.         doDbStuff2();    
  6.      } catch (Exception e) {    
  7.           e.printStackTrace();       
  8.           TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是這一句了,加上之後,如果doDbStuff2()拋了異常,                                                                                     //doDbStuff1()是會回滾的  
      
  9.             return “xxx錯誤資訊”;  
  10.      }    
  11. }