阿裡巴巴Java規範:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中顯示的rollback。
異常的分類
先來看看異常的分類
error是一定會復原的
這裡Exception是異常,他又分為運作時異常RuntimeException和非運作時異常
- 可查的異常(checked exceptions):Exception下除了RuntimeException外的異常
- 不可查的異常(unchecked exceptions):RuntimeException及其子類和錯誤(Error)
如果不對運作時異常進行處理,那麼出現運作時異常之後,要麼是線程中止,要麼是主程式終止。 如果不想終止,則必須捕獲所有的運作時異常,決不讓這個處理線程退出。
隊列裡面出現異常資料了,正常的處理應該是把異常資料舍棄,然後記錄日志。不應該由于異常資料而影響下面對正常資料的處理。
非運作時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。如IOException、SQLException等以及使用者自定義的Exception異常。
對于這種異常,JAVA編譯器強制要求我們必須對出現的這些異常進行catch并處理,否則程式就不能編譯通過。是以,面對這種異常不管我們是否願意,隻能自己去寫一大堆catch塊去處理可能的異常。
@Transactional 的寫法
開始主題,@Transactional如果隻這樣寫,
Spring架構的事務基礎架構代碼将預設地 隻 在抛出運作時和unchecked exceptions時才辨別事務復原。
也就是說,當抛出個RuntimeException 或其子類例的執行個體時。(Errors 也一樣 - 預設地 - 辨別事務復原。)從事務方法中抛出的Checked exceptions将 不 被辨別進行事務復原。
- 讓checked例外也復原:在整個方法前加上 @Transactional(rollbackFor=Exception.class)
- 讓unchecked例外不復原:@Transactional(notRollbackFor=RunTimeException.class)
- 不需要事務管理的(隻查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:如果異常被try{}catch{}了,事務就不復原了,如果想讓事務復原必須再往外抛try{}catch{throw Exception}。
注意
Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實作的任何接口上。
你當然可以在接口上使用 @Transactional 注解,但是這将隻能當你設定了基于接口的代理時它才生效。
因為注解是不能繼承的,這就意味着如果你正在使用基于類的代理時,那麼事務的設定将不能被基于類的代理所識别,而且對象也将不會被事務代理所包裝(将被确認為嚴重的)。是以,請接受Spring團隊的建議并且在具體的類上使用 @Transactional 注解。
@Transactional 注解辨別的方法,處理過程盡量的簡單。尤其是帶鎖的事務方法,能不放在事務裡面的最好不要放在事務裡面。可以将正常的資料庫查詢操作放在事務前面進行,而事務内進行增、删、改、加鎖查詢等操作。
作者:Mint6
blog.csdn.net/Mint6/article/details/78363761
往期精選
看完讓你徹底了解 WebSocket 原理,附完整的實戰代碼(包含前端和後端)
讀寫分離很難嗎?springboot結合aop簡單就實作了
資料持久化架構為什麼放棄 Hibernate、JPA、Mybatis,最終選擇 JDBCTemplate?
MySQL 中 update 修改資料與原資料相同會再次執行嗎?
MyBatis 架構中動态 SQL 應用分析,之後寫 SQL 就爽很多了
用完 Gradle 後,有點嫌棄 Maven 了!速度賊快!
優秀的 Java 項目,代碼都是如何分層的?
Spring 為啥預設把 bean 設計成單例的?這篇講的明明白白
為什麼代碼規範要求SQL語句不要過多的join?
Spring Boot 最流行的 16 條實踐,Java 開發變得更加簡單!
點個贊,就知道你“在看”!