Spring事務的傳播特性

2022-09-14 07:18:10 字數 2420 閱讀 4402

spring中通過propagation來設定事務的傳播屬性的,在這個屬性中提供了我們其中關於事務傳播的特性:

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

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

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

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

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

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

7.     propagation_nested:支援當前事務,新增s**epoint點,與當前事務同步提交或回滾。

具體解釋一下:

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:必須在乙個事務中執行。也就是說,他只能被乙個父事務呼叫。否則,他就要丟擲異常。

4.     propagation_requires_new:這個就比較繞口了。 比如我們設計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事務仍 然可能提交。

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

6.     propagation_never:不能在事務中執行。假設servicea.methoda的事務級別是 propagation_required, 而serviceb.methodb的事務級別是propagation_never ,那麼serviceb.methodb就要丟擲異常了。

7.     propagation_nest:理解nested的關鍵是s**epoint。

他 與propagation_requires_new的區別是,propagation_requires_new另起乙個事務,將會與他的父事務相互獨 立, 而nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。也就是說,如果父事務最後回滾,他也要回滾的。而nested事務的 好處是他有乙個s**epoint。也就是說serviceb.methodb失敗回滾,那麼servicea.methoda也會回滾到 s**epoint點上,servicea.methoda可以選擇另外乙個分支,比如 servicec.methodc,繼續執行,來嘗試完成自己的事務。 但是這個事務並沒有在ejb標準中定義。

spring事務傳播特性

1.propagation required 如果存在乙個事務 則支援當前事務。如果沒有事務則開啟。2.propagation supports 如果存在乙個事務 則支援當前事務。如果沒有事務則非事務執行。3.propagation mandatory 如果已經存在乙個事務 則支援當前事務。如果沒有...

spring事務傳播特性

spring事務傳播特性 事務傳播行為就是多個事務方法相互呼叫時,事務如何在這些方法間傳播。spring支援7種事務傳播行為 spring 預設的事務傳播行為是 propagation required,它適合於絕大多數的情況。假設 servivex methodx 都工作在事務環境下 即都被 sp...

Spring事務傳播特性

傳播性值描述 propagation required 0當前有事務就用當前的,沒有就用新的 propagation supports 1事務可有可無,不是必須的 propagation mandatory 2當前一定要有事務,不然就拋異常 propagation requires new 3無論是...