溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么需要在事務(wù)注解@Transactional中指定rollbackFor

發(fā)布時(shí)間:2021-12-09 17:53:03 來源:億速云 閱讀:479 作者:柒染 欄目:大數(shù)據(jù)

為什么需要在事務(wù)注解@Transactional中指定rollbackFor,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

1.異常的分類

先來看看異常的分類

為什么需要在事務(wù)注解@Transactional中指定rollbackFor

error是一定會(huì)回滾的

這里Exception是異常,他又分為運(yùn)行時(shí)異常RuntimeException和非運(yùn)行時(shí)異常

為什么需要在事務(wù)注解@Transactional中指定rollbackFor

  • 可查的異常(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異常。擴(kuò)展:Java項(xiàng)目構(gòu)建基礎(chǔ):統(tǒng)一結(jié)果,統(tǒng)一異常,統(tǒng)一日志

對(duì)于這種異常,JAVA編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行catch并處理,否則程序就不能編譯通過。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆catch塊去處理可能的異常。

 

2.@Transactional 的寫法

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

Spring框架的事務(wù)基礎(chǔ)架構(gòu)代碼將默認(rèn)地 只 在拋出運(yùn)行時(shí)和unchecked exceptions時(shí)才標(biāo)識(shí)事務(wù)回滾。

也就是說,當(dāng)拋出個(gè)RuntimeException 或其子類例的實(shí)例時(shí)。(Errors 也一樣 - 默認(rèn)地 - 標(biāo)識(shí)事務(wù)回滾。)從事務(wù)方法中拋出的Checked exceptions將 不 被標(biāo)識(shí)進(jìn)行事務(wù)回滾。

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

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

  • 不需要事務(wù)管理的(只查詢的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

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

 

注意

Spring團(tuán)隊(duì)的建議是你在具體的類(或類的方法)上使用 @Transactional 注解,而不要使用在類所要實(shí)現(xiàn)的任何接口上。

你當(dāng)然可以在接口上使用 @Transactional 注解,但是這將只能當(dāng)你設(shè)置了基于接口的代理時(shí)它才生效。

因?yàn)?strong>注解是不能繼承的,這就意味著如果你正在使用基于類的代理時(shí),那么事務(wù)的設(shè)置將不能被基于類的代理所識(shí)別,而且對(duì)象也將不會(huì)被事務(wù)代理所包裝(將被確認(rèn)為嚴(yán)重的)。因此,請(qǐng)接受Spring團(tuán)隊(duì)的建議并且在具體的類上使用 @Transactional 注解。

@Transactional 注解標(biāo)識(shí)的方法,處理過程盡量的簡單。尤其是帶鎖的事務(wù)方法,能不放在事務(wù)里面的最好不要放在事務(wù)里面??梢詫⒊R?guī)的數(shù)據(jù)庫查詢操作放在事務(wù)前面進(jìn)行,而事務(wù)內(nèi)進(jìn)行增、刪、改、加鎖查詢等操作。

注:rollbackFor 可以指定能夠觸發(fā)事務(wù)回滾的異常類型。Spring默認(rèn)拋出了未檢查unchecked異常(繼承自 RuntimeException 的異常)或者 Error才回滾事務(wù);其他異常不會(huì)觸發(fā)回滾事務(wù)。

如果在事務(wù)中拋出其他類型的異常,但卻期望 Spring 能夠回滾事務(wù),就需要指定 rollbackFor屬性。

關(guān)于為什么需要在事務(wù)注解@Transactional中指定rollbackFor問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI