Spring的事務管理與回滾

2021-06-20 15:32:38 字數 2831 閱讀 2531

最近在做專案的時候,才發現對spring的事務是那麼不了解,因此花了一些時間總結了一下自己對spring的事務的理解。

spring、ejb的宣告式事務

預設情況下都是在

丟擲unchecked exception並且這異常是runtimeexception或它的子類

後才會觸發事務的回滾。

在測試專案寫了乙個dao,向mysql資料庫插入資料,

下面分幾種情況總結下:

第一種:程式執行出錯,但沒有異常 try{}catch

public void  add()

配置檔案:

propagation_required			

測試結果:事務回滾,沒有向資料庫插入資料。

第二種:程式執行錯誤,但有把異常try{}catch

public void  add() catch (exception e)

}ps:配置檔案沒有改

測試結果:事務回滾,沒有向資料庫插入資料。

第三種:程式執行出錯,有把異常try{}catch,但丟擲異常不是runtimeexception或它的子類

public void  add() throws  classnotfoundexception catch (exception e)

}

ps:配置檔案沒有改

測試結果:事務不回滾,向資料庫插入資料。

第四種:程式執行出錯,有把異常try{}catch,但丟擲異常不是runtimeexception或它的子類,在配置檔案增加指定會回滾的異常類

public void  add() throws  classnotfoundexception catch (exception e)

}配置檔案修改為:

class="org.springframework.transaction.interceptor.transactionproxyfactorybean">

ref="localtransactionmanager" />

propagation_required,-classnotfoundexception

測試結果:事務回滾,沒有向資料庫插入資料。

總結:

1、propagation (事務的傳播屬性)

propagation_supports--支援當前事務,如果當前沒有事務,就以非事務方式執行。

propagation_mandatory--支援當前事務,如果當前沒有事務,就丟擲異常。

propagation_requires_new--新建事務,如果當前存在事務,把當前事務掛起。

propagation_not_supported--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

propagation_never--以非事務方式執行,如果當前存在事務,則丟擲異常。

1: propagation_required

加入當前正要執行的事務不在另外乙個事務裡,那麼就起乙個新的事務

比如說,serviceb.methodb的事務級別定義為propagation_required, 那麼由於執行servicea.methoda的時候,

servicea.methoda已經起了事務,這時呼叫serviceb.methodb,serviceb.methodb看到自己已經執行在servicea.methoda

的事務內部,就不再起新的事務。而假如servicea.methoda執行的時候發現自己沒有在事務中,他就會為自己分配乙個事務。

這樣,在servicea.methoda或者在serviceb.methodb內的任何地方出現異常,事務都會被回滾。即使serviceb.methodb的事務已經被

提交,但是servicea.methoda在接下來fail要回滾,serviceb.methodb也要回滾

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

3、在呼叫業務方法丟擲異常,並把它catch到並且沒有向外拋異常,則==生吞掉異常

,對於丟擲的異常不是runtimeexception或它的子類,事務不會回滾的。

4、在呼叫業務方法丟擲異常,這異常不是runtimeexception或它的子類,並把catch異常並向外拋,如果在事務傳播配置加上指定會回滾的異常,則事務會回滾的。

5、在呼叫業務方法丟擲異常,如果在事務傳播配置加上指定會回滾的異常(不是runtimeexception或它的子類),對於發生的異常是runtimeexception或它的子類,則事務也會回滾的。

spring事務回滾

註解方式宣告事務,該事務宣告的範圍是service中的方法,而一般的事務宣告時不是宣告在 業務邏輯方法上的,而是宣告在單一的資料庫操作方法上的 transactional publicclassuserserviceimplimplementsuserservice,newint thrownewe...

spring事務回滾

1 核心 只有丟擲 runtimeexception 才會回滾,其他情況都不會 2 基本 1.spring事務配置 advice ref txadvice 2.service層 public class personservice 3.sqlmap values name age version s...

spring事務回滾

被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop 才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimeexcetpion的異常,但可以通過 配置來捕獲特定的異常並回滾換句話說在service的方法中不使用try catch 或者在catch中最後加上throw new r...