Spring中事務傳播 1

2021-06-15 09:43:47 字數 1218 閱讀 8313

一、propagation :

key屬性確定**應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:

propagation_required--支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。

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

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

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

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

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

先來說說 spring 巢狀事務

舉個例子

servicea    

}   

serviceb    

}  我們這裡乙個個分析吧

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:   propagation_supports

如果當前在事務中,即以事務的形式執行,如果當前不再乙個事務中,那麼就以非事務的形式執行

這就跟平常用的普通非事務的**只有一點點區別了。不理這個,因為我也沒有覺得有什麼區別

3:   propagation_mandatory

必須在乙個事務中執行。也就是說,他只能被乙個父事務呼叫。否則,他就要丟擲異常。

spring事務傳播

採用程式設計式事務 1 getcurrentsession 與opensession 的區別?採用getcurrentsession 建立的session會繫結到當前執行緒中,而採用opensession 建立的session則不會 採用getcurrentsession 建立的session在co...

Spring事務傳播

required 預設 如果當前存在事務,就加入該事務,如果不存在,則建立乙個新的事務 supports 如果呼叫者有事務,則加入該事務,如果沒有,則以非事務方式執行 mandatory 如果存在事務,則加入該事務,如果不存在事務,則拋異常 requires new 重新建立乙個新的事務,如果當前存...

Spring事務傳播

package org.springframework.transaction import org.springframework.lang.nullable public inte ce transactiondefinition 事務的傳播面向的是乙個方法在另乙個方法中執行時對事務的處理方式。...