推薦閱讀:《Java開發手冊(嵩山版)》最新發布
阿里巴巴Java開發手冊規范提示:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中顯示的rollback,
1.例外的分類
先來看看例外的分類

error是一定會回滾的,這里Exception是例外,他又分為運行時例外RuntimeException和非運行時例外

可查的例外(checked exceptions):
Exception下除了RuntimeException外的例外
不可查的例外(unchecked exceptions):
RuntimeException及其子類和錯誤(Error)
如果不對運行時例外進行處理,那么出現運行時例外之后,要么是執行緒中止,要么是主程式終止,
如果不想終止,則必須捕獲所有的運行時例外,決不讓這個處理執行緒退出,佇列里面出現例外資料了,正常的處理應該是把例外資料舍棄,然后記錄日志,不應該由于例外資料而影響下面對正常資料的處理,
非運行時例外是RuntimeException以外的例外,型別上都屬于Exception類及其子類,如IOException、SQLException等以及用戶自定義的Exception例外,對于這種例外,JAVA編譯器強制要求我們必需對出現的這些例外進行catch并處理,否則程式就不能編譯通過,
所以,面對這種例外不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的例外,
2.@Transactional 的寫法
開始主題@Transactional如果只這樣寫,Spring框架的事務基礎架構代碼將默認地只在拋出運行時和unchecked exceptions時才標識事務回滾,
也就是說,當拋出個RuntimeException 或其子類例的實體時,(Errors 也一樣 - 默認地 - 標識事務回滾,)從事務方法中拋出的Checked exceptions將 不 被標識進行事務回滾,
1 讓checked例外也回滾:在整個方法前加上
@Transactional(rollbackFor=Exception.class)
2 讓unchecked例外不回滾:
@Transactional(notRollbackFor=RunTimeException.class)
3 不需要事務管理的(只查詢的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:如果例外被try{}catch{}了,事務就不回滾了,如果想讓事務回滾必須再往外拋try{}catch{throw Exception},事務失效的 8 大原因這篇看一下,
注意:
Spring團隊的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實作的任何介面上,你當然可以在介面上使用 @Transactional 注解,但是這將只能當你設定了基于介面的代理時它才生效,
因為注解是不能繼承的,這就意味著如果你正在使用基于類的代理時,那么事務的設定將不能被基于類的代理所識別,而且物件也將不會被事務代理所包裝(將被確認為嚴重的),
因此,請接受Spring團隊的建議并且在具體的類上使用 @Transactional 注解,
另外,@Transactional 注解標識的方法,處理程序盡量的簡單,尤其是帶鎖的事務方法,能不放在事務里面的最好不要放在事務里面,可以將常規的資料庫查詢操作放在事務前面進行,而事務內進行增、刪、改、加鎖查詢等操作,
著作權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,本文鏈接:https://blog.csdn.net/Mint6/article/details/78363761
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/51243.html
標籤:Java
