Spring中拋出異常時,既要要返回錯誤信息,還要作事務回滾

狀況一:若是沒有在程序中手動捕獲異常,以下代碼事務會回滾java

@Transactional(rollbackFor = { Exception.class })    
public void test() throws Exception {    
     doDbStuff1();    
     doDbStuff2();//假如這個操做數據庫的方法會拋出異常,方法doDbStuff1()對數據庫的操做會回滾。    
}  

 若是doDbStuff2()方法拋出異常,方法doDbStuff1()對數據庫的操做會回滾。  數據庫

 

狀況二:若是在程序中自已捕獲異常未往外拋,以下代碼事務不會回滾spa

@Transactional(rollbackFor = { Exception.class })    
public void test() {    
     try {    
        doDbStuff1();    
        doDbStuff2();//假如這個操做數據庫的方法會拋出異常,如今方法doDbStuff1()對數據庫的操做  不會回滾。    
     } catch (Exception e) {    
           e.printStackTrace();       
     }    
}  

        若是doDbStuff2()這個操做數據庫的方法拋出異常,由於將異常捕獲未往外拋,方法doDbStuff1()對數據庫的操做不會回滾。.net

 

狀況三:若是本身須要捕獲異常又要返回錯誤時,能夠參考如下作法blog

@Transactional(rollbackFor = { Exception.class })    
public void test() {    
     try {    
        doDbStuff1();    
        doDbStuff2();    
     } catch (Exception e) {    
          e.printStackTrace();       
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是這一句了,加上以後,若是doDbStuff2()拋了異常,doDbStuff1()是會回滾的 
 return 「xxx錯誤信息」; } }


 
 
 
 
原文:https://blog.csdn.net/jarniyy/article/details/79674501
相關文章
相關標籤/搜索