溫馨提示×

溫馨提示×

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

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

Spring事務(wù)管理只對出現(xiàn)運行期異常進(jìn)行回滾

發(fā)布時間:2020-07-12 11:32:54 來源:網(wǎng)絡(luò) 閱讀:198 作者:淺嫣 欄目:開發(fā)技術(shù)

Spring事務(wù)管理只對出現(xiàn)運行期異常進(jìn)行回滾


           

使用spring難免要用到spring的事務(wù)管理,要用事務(wù)管理又會很自然的選擇聲明式的事務(wù)管理,在spring的文檔中說道,spring聲明式事務(wù)管理默認(rèn)對非檢查型異常和運行時異常進(jìn)行事務(wù)回滾,而對檢查型異常則不進(jìn)行回滾操作。
那么什么是檢查型異常什么又是非檢查型異常呢?
最簡單的判斷點有兩個:
1.繼承自runtimeexception或error的是非檢查型異常,而繼承自exception的則是檢查型異常(當(dāng)然,runtimeexception本身也是exception的子類)。

2.對非檢查型類異??梢圆挥貌东@,而檢查型異常則必須用try語句塊進(jìn)行處理或者把異常交給上級方法處理總之就是必須寫代碼處理它。所以必須在service捕獲異常,然后再次拋出,這樣事務(wù)方才起效。

結(jié)論:

在spring的事務(wù)管理環(huán)境下,使用unckecked exception可以極大地簡化異常的處理,只需要在事務(wù)層聲明可能拋出的異常(這里的異常可以是自定義的unckecked exception體系),在所有的中間層都只是需要簡單throws即可,不需要捕捉和處理,直接到最高層,比如UI層再進(jìn)行異常的捕捉和處理


在service類前加上@Transactional,聲明這個service所有方法需要事務(wù)管理。每一個業(yè)務(wù)方法開始時都會打開一個事務(wù)。

Spring默認(rèn)情況下會對運行期例外(RunTimeException)進(jìn)行事務(wù)回滾。這個例外是unchecked

如果遇到checked意外就不回滾。

如何改變默認(rèn)規(guī)則:

1 讓checked例外也回滾:在整個方法前加上 @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}。


一個統(tǒng)一的異常層次結(jié)構(gòu)對于提供服務(wù)抽象是必需的。 最重要的就是org.springframework.dao.DataAccessException以及其子類了。 需要強(qiáng)調(diào)的是Spring的異常機(jī)制重點在于應(yīng)用編程模型。與SqlException和其他數(shù)據(jù)存取API不同的是: Spring的異常機(jī)制是為了讓開發(fā)者使用最少, 最清晰的代碼。DataAccessException和其他底層異常都是非檢查性異常(unchecked exception)。 spring的原則之一就是基層異常就應(yīng)該是非檢查性異常. 原因如下: 
1. 基層異常通常來說是不可恢復(fù)的。 
2. 檢查性異常將會降低異常層次結(jié)構(gòu)的價值.如果底層異常是檢查性的, 那么就需要在所有地方添加catch語句進(jìn)行捕獲。 
3.try/catch代碼塊冗長混亂, 而且不增加多少價值。 
使用檢查異常理論上很好, 但是實際上好象并不如此。 
Hibernate3也將從檢查性異常轉(zhuǎn)為非檢查性異常。


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

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

AI