spring 使用事務注解@Transactional 異常捕獲事務失效的問題


 

在spring的文檔中說道,spring聲明式事務管理默認對非檢查型異常和運行時異常進行事務回滾,而對檢查型異常則不進行回滾操作。

什么是檢查型異常和什么是非檢查型異常?

1:非檢查型異常

     繼承自RuntimeException(也是Exception的子類)或error的是非檢查型異常

  非檢查型類異常可以不用捕獲

2:檢查型異常

       繼承自Exception的則是檢查型異常

  而檢查型異常則必須用try語句塊進行處理或者把異常交給上級方法處理

 

spring的事務邊界是在調用業務方法之前開始的,業務方法執行完畢之后來執行commit or rollback(Spring默認取決於是否拋出runtime異常).
如果拋出runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾

 

在實際業務中 如果我們把業務方法放到一個catch中,這個業務方法也就等於脫離了spring事務的管理,因為沒有任何異常會從業務方法中拋出!全被捕獲並吞掉,導致spring異常拋出觸發事務回滾策略失效。

這樣的話,我們需要在catch 里面 手動去回滾 加上 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 這段就OK了

    try {   

           method1();

   method2();

          } catch(Exception e) {   

             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

   }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM