spring事務的傳播機制新解

2022-03-18 12:03:04 字數 2224 閱讀 2731

@transactional(propagation=propagation.required)

如果有事務, 那麼加入事務, 沒有的話新建乙個(預設情況下)

@transactional(propagation=propagation.not_supported)

容器不為這個方法開啟事務

@transactional(propagation=propagation.requires_new)

不管是否存在事務,都建立乙個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務

@transactional(propagation=propagation.mandatory)

必須在乙個已有的事務中執行,否則丟擲異常

@transactional(propagation=propagation.never)

必須在乙個沒有的事務中執行,否則丟擲異常(與propagation.mandatory相反)

@transactional(propagation=propagation.supports)

如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.

servicea

servicea 

}

serviceb

serviceb       

}

假如當前正要執行的事務不在另外乙個事務裡,那麼就起乙個新的事務 比方說,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也要回滾

假設當前在事務中。即以事務的形式執行。假設當前不在乙個事務中,那麼就以非事務的形式執行

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

這個就比較繞口了。 比方我們設計servicea.methoda的事務級別為propagation_required,serviceb.methodb的事務級別為propagation_requires_new。那麼當執行到serviceb.methodb的時候,servicea.methoda所在的事務就會掛起。serviceb.methodb會起乙個新的事務。等待serviceb.methodb的事務完畢以後,他才繼續執行。

他與propagation_required 的事務差別在於事務的回滾程度了。由於serviceb.methodb是新起乙個事務,那麼就是存在兩個不同的事務。假設serviceb.methodb已經提交,那麼servicea.methoda失敗回滾。serviceb.methodb是不會回滾的。假設serviceb.methodb失敗回滾,假設他丟擲的異常被servicea.methoda捕獲,servicea.methoda事務仍然可能提交。

當前不支援事務。比方servicea.methoda的事務級別是propagation_required 。而serviceb.methodb的事務級別是propagation_not_supported ,那麼當執行到serviceb.methodb時。servicea.methoda的事務掛起。而他以非事務的狀態執行完,再繼續servicea.methoda的事務。

不能在事務中執行。

如果servicea.methoda的事務級別是propagation_required。 而serviceb.methodb的事務級別是propagation_never ,那麼serviceb.methodb就要丟擲異常了。

如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。

參考:

Spring事務傳播機制

在 spring的 transactiondefinition介面中一共定義了7種事務傳播屬性 propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇,也是spring事務傳播機制的預設值。propagation supports 支援當前事務,如...

spring事務傳播機制

1.required 必須有乙個事務的支援。如果沒有事務,則新建立乙個,如果有父事務,則使用 fetch 父級事務 2.requires new 必定會建立乙個事務。如果有父事務,則掛起 suspend 父事務,等子事務執行完畢,在恢復 resume 父事務 3.supports 可以有或者沒有事務...

spring事務傳播機制

spring事務傳播機制 propagation required spring預設 如果已經存在事務,那麼加入當前事務,如果不存在事務,則新建事務。總是建立乙個新的事務。新建立事務a,而以前的事務b還在執行。此時有兩個事務,事務a先執行,事務b則被掛起。只有事務a執行完畢後,事務b將繼續執行。ro...