閱讀本文大概需要 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及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識