为啥阿里巴巴规定要在 @Transactional 指定 rollbackFor?
阿里巴巴Java開發(fā)手冊(cè)規(guī)范提示:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中顯示的rollback。
1.異常的分類
先來(lái)看看異常的分類
error是一定會(huì)回滾的,這里Exception是異常,他又分為運(yùn)行時(shí)異常RuntimeException和非運(yùn)行時(shí)異常
可查的異常(checked exceptions):
Exception下除了RuntimeException外的異常
不可查的異常(unchecked exceptions):
RuntimeException及其子類和錯(cuò)誤(Error)
如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須捕獲所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,然后記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。
非運(yùn)行時(shí)異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。如IOException、SQLException等以及用戶自定義的Exception異常。對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch并處理,否則程序就不能編譯通過(guò)。
所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。
2.@Transactional 的寫法
開始主題@Transactional如果只這樣寫,Spring框架的事務(wù)基礎(chǔ)架構(gòu)代碼將默認(rèn)地只在拋出運(yùn)行時(shí)和unchecked exceptions時(shí)才標(biāo)識(shí)事務(wù)回滾。
也就是說(shuō),當(dāng)拋出個(gè)RuntimeException?或其子類例的實(shí)例時(shí)。(Errors?也一樣 - 默認(rèn)地 - 標(biāo)識(shí)事務(wù)回滾。)從事務(wù)方法中拋出的Checked exceptions將 不 被標(biāo)識(shí)進(jìn)行事務(wù)回滾。
1 讓checked例外也回滾:在整個(gè)方法前加上?
@Transactional(rollbackFor=Exception.class)
2 讓unchecked例外不回滾:
@Transactional(notRollbackFor=RunTimeException.class)
3 不需要事務(wù)管理的(只查詢的)方法:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:如果異常被try{}catch{}了,事務(wù)就不回滾了,如果想讓事務(wù)回滾必須再往外拋try{}catch{throw Exception}。事務(wù)失效的 8 大原因這篇看一下。
注意:
Spring團(tuán)隊(duì)的建議是你在具體的類(或類的方法)上使用 @Transactional?注解,而不要使用在類所要實(shí)現(xiàn)的任何接口上。你當(dāng)然可以在接口上使用 @Transactional 注解,但是這將只能當(dāng)你設(shè)置了基于接口的代理時(shí)它才生效。
因?yàn)樽⒔馐遣荒芾^承的,這就意味著如果你正在使用基于類的代理時(shí),那么事務(wù)的設(shè)置將不能被基于類的代理所識(shí)別,而且對(duì)象也將不會(huì)被事務(wù)代理所包裝(將被確認(rèn)為嚴(yán)重的)。
因此,請(qǐng)接受Spring團(tuán)隊(duì)的建議并且在具體的類上使用 @Transactional 注解。
另外,@Transactional 注解標(biāo)識(shí)的方法,處理過(guò)程盡量的簡(jiǎn)單。尤其是帶鎖的事務(wù)方法,能不放在事務(wù)里面的最好不要放在事務(wù)里面。可以將常規(guī)的數(shù)據(jù)庫(kù)查詢操作放在事務(wù)前面進(jìn)行,而事務(wù)內(nèi)進(jìn)行增、刪、改、加鎖查詢等操作。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/Mint6/article/details/78363761
總結(jié)
以上是生活随笔為你收集整理的为啥阿里巴巴规定要在 @Transactional 指定 rollbackFor?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java 分布式 RPC 框架性能大比拼
- 下一篇: 用好 Java 中的枚举,真的没有那么简