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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章