try catch對Spring事務的影響

2021-09-18 01:32:54 字數 1634 閱讀 8558

一、spring 的預設事務機制,當出現unchecked異常時候回滾,checked異常的時候不會回滾。

異常中unchecked異常包括error和runtime異常。需要try catch或向上丟擲的異常,為checked異常比如ioexception,也就是說程式丟擲runtime異常的時候才會進行回滾,其他異常不回滾,可以配置設定所有異常回滾:

@transactional(rollbackfor = )

當有try catch後捕獲了異常,事務不會回滾。如果不得不在service層寫try catch 需要catch後 throw new runtimeexception 讓事務回滾。

spring的aop即宣告式事務管理,預設是針對unchecked exception回滾。也就是預設對runtimeexception()異常或是其子類進行事務回滾;checked異常,即exception可try{}捕獲的不會回滾。如果使用try-catch捕獲丟擲的unchecked異常後,沒有在catch塊中採用頁面硬編碼的方式使用spring api對事務做顯式的回滾,則事務不會回滾。「將異常捕獲,並且在catch塊中不對事務做顯式提交相當於生吞掉異常」 ,要想捕獲非執行時異常則需要如下配置:

解決辦法:

在針對事務的類中丟擲runtimeexception異常,而不是丟擲exception。

在txadive中增加rollback-for,裡面寫自己的exception,例如自己寫的exception:

或者定義不回滾的異常

二、spring的事務邊界是在呼叫業務方法之前開始的,業務方法執行完畢之後來執行commit or rollback(spring預設取決於是否丟擲runtime異常)。

如果丟擲runtime exception 並在你的業務方法中沒有catch到的話,事務會回滾。

一般不需要在業務方法中catch異常,如果非要catch,在做完你想做的工作後(比如關閉檔案等)一定要丟擲runtime exception,否則spring會將你的操作commit,這樣就會產生髒資料。所以你的catch**是畫蛇添足。

如:由此可以推知,在spring中,如果某個業務方法被整個包裹起來,則這個業務方法也就等於脫離了spring事務的管理,因為沒有任何異常會從業務方法中丟擲!全**獲併吞掉,導致spring異常丟擲觸發事務回滾策略失效。不過,如果在catch**塊中採用頁面硬編碼的方式使用spring api對事務做顯式的回滾,這樣寫也未嘗不可。

三、基於註解的事務:

transactional的異常控制,預設是check exception 不回滾,uncheck exception回滾;

如果配置了rollbackfor 和 norollbackfor 且兩個都是用同樣的異常,那麼遇到該異常,還是回滾;

rollbackfor 和norollbackfor 配置也許不會含蓋所有異常,對於遺漏的按照check exception 不回滾,uncheck exception回滾。

try catch影響spring事務嗎?對於這個問題有兩種情況:

1.catch只列印異常,不丟擲異常

此方法會影響事務,此時資料庫中訂單資料會插入成功!因為spring的事務的標準是runtimeexception。

2.catch列印異常,並丟擲異常

此方法不會影響事務,因為丟擲了runtimeexception。

try catch裡面try catch巢狀

try catch裡能否內嵌try catch?答案是肯定的。但是等內層try catch出異常之後是個什麼執行順序呢?看下面 static void main string args catch exception ex finally console.readkey private static...

C 對try catch和void的簡單理解

最近學到c 前面都還好,但是學到函式這,我就有點矇圈了。尤其是看到try catch這裡,我真是不懂了。而對這個void好奇是因為今天翻譯,看到了這個單詞,結果一臉懵逼,所以看到這個詞就很親切正好自己理解的也不深,就主動去查了查,以下是我理解。try catch 第一開始,我是在vs裡按f1鍵查到的...

Spring(七)Spring對JDBC支援

1 spring中使用jdbc spring dao層中對jdbc進行了封裝,使用模板模式的設計模式,通過ioc被動注入的方式將jdbctemplate這個模板類注入到資料物件中,進行資料庫操作。我們要在乙個類中進行crud操作 crud主要被用在描述軟體系統中資料庫或者持久層的基本操作功能。首先要...