Spring事務處理機制之RuntimeException()和Exception()區別


RuntimeException()和Exception()區別:

1.繼承自RuntimeException或error的是非檢查型異常,而繼承自exception的則是檢查型異常(當然,runtimeexception本身也是exception的子類)。
2.對非檢查型類異常可以不用捕獲,而檢查型異常則必須用try語句塊進行處理或者把異常交給上級方法處理總之就是必須寫代碼處理它。所以必須在service捕獲異常,然后再次拋出,這樣事務方才起效。

Spring事務默認只在發生未被捕獲的RuntimeException()時才進行回滾。

Spring通過SpringAOP進行聲明式事務管理:

  SpringAOP異常捕獲的原理:被攔截的方法需顯式拋出異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,

默認情況下SpringAOP只捕獲RuntimeException的異常,因此不是RuntimeException或其子類的異常不能夠捕獲,默認情況下不進行回滾,

但可以通過配置來捕獲特定的異常並回滾 。

因此:

方法1:在service層不使用try......catch或者在catch中最后加上throw new RuntimeException(),這樣程序異常時aop才可以捕獲異常並進行回滾。

最終在service上層(如controller層、action層、view層)要繼續捕獲這個異常並處理。

方法2:在service層方法上進行配置,改變默認規則,方法如下 :

(1) 讓checked例外也回滾:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
 
(2)讓unchecked例外不回滾: @Transactional(notRollbackFor=RunTimeException.class)
 
(3)不需要事務管理的(只查詢的)方法:@Transactional(propagation=Propagation. NOT_SUPPORTED)
 
  在整個方法運行前就不會開啟事務還可以加上:@Transactional(propagation=Propagation. NOT_SUPPORTED,readOnly=true),這樣就做成一個只讀事務,可以提高效率。

 


免責聲明!

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



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