爲什麼阿里規定需要在事務註解 @Transactional 中指定 rollbackFor?

閱讀本文大概需要 2 分鐘。

來自:blog.csdn.net/Mint6/article/details/78363761

java阿里巴巴規範提示:方法【編輯】需要在事務註解指定rollbackFor或者在方法中顯示的rollback。

1.異常的分類

先來看看異常的分類:

錯誤是一定會回滾的。

這裏Exception是異常,他又分爲運行時異常RuntimeException和非運行時異常。

可查的異常(已檢查異常):Exception下除RuntimeException外的異常

不可查的異常(懷疑檢查的異常):RuntimeException及其子類和錯誤(Error)

如果不對運行時異常進行處理,那麼出現運行時異常之後,或者是線程中止,則是主程序終止。如果不想終止,則必須捕獲所有的運行時異常,決不讓這個處理線程退出。異常數據了,,正常的處理應該是把異常數據捨棄,然後記錄日誌。不應該由於異常數據而影響下面對正常數據的處理。

對於這種異常,JAVA編譯器強制要求我們必需對出現的這些因此,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。

2. @ Transactional的寫法

開始主題@Transactional如果只這樣寫,

那,當投擲一個此類RuntimeException子類實例的實例時。(Errors也一樣-交替地-標識事務回滾。)從事務方法中拋出的已檢查異常將不被標識進行事務回滾。

1讓checked例外也回滾:在整個方法前加上@Transactional(rollbackFor = Exception.class)

2讓unchecked例外不回滾:@Transactional(notRollbackFor = RunTimeException.class)

3不需要事務管理的(只查詢的)方法:@Transactional(傳播=傳播。NOT_SUPPORTED)

注意:如果異常被try {} catch {}扔掉,事務就不回滾了,如果想讓事務回滾必須再往外拋try {} catch {throw Exception}。

注意:

  • Spring團隊的建議是你在具體的類(或類的方法)上使用@Transactional註解,而不要使用在類所要實現的任何接口上。你當然可以在接口上使用@Transactional註解,但是這將只能因爲註解是不能繼承的,這意味着如果您正在使用基於類的代理時,那麼事務的設置將不能被基於類的代理所識別,而且對象也將不會被事務代理所包裝(將被確認爲嚴重的)。因此,請接受Spring團隊的建議和在具體的類上使用@Transactional註解。

  • @Transactional註解標識的方法,處理過程正確的簡單。尤其是帶鎖的事務方法,能不放在事務裏面的最好不要放在事務裏面。可以將常規的數據庫查詢操作放在事務前面進行,而事務內部進行增值,刪除,改,加鎖查詢等操作。

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

 

 
   

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