Spring事務傳播機制

2021-08-02 11:17:03 字數 2209 閱讀 6053

在 spring的 transactiondefinition介面中一共定義了7種事務傳播屬性:

propagation_required– 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇,也是spring事務傳播機制的預設值。

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

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

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

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

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

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

加上不加事務,我們總共有8種選擇。

下面做了一點測試,寫了2個簡單的service,來測試事務的傳播機制,methoda分別遍歷上面8種case,methodb同理,那麼我們總共有64種選擇。當然,除了這64種,還有需要討論的。

所以,我們要跑的case有2*64=128種,上面的64種加上a在呼叫b後是否拋異常。

servicea    

} serviceb

}

注:下面空白表示ab都執行了,b回滾表示b可能真的回滾了,也可能表示b根本就沒往資料庫插資料。

methoda\methodb

無事務required

supports

mandatory

requires_new

not_supported

never

nested

無事務a寫入,b回滾

required

a回滾、b回滾

supports

a寫入、b回滾

mandatory

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

requires_new

a回滾、b回滾

not_supported

a寫入、b回滾

never

a寫入、b回滾

nested

a回滾b回滾

methoda\methodb

無事務required

supports

mandatory

requires_new

not_supported

never

nested

無事務a寫入,b回滾

required

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b寫入

a回滾、b寫入

a回滾、b回滾

a回滾、b回滾

supports

a寫入、b回滾

mandatory

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

requires_new

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b寫入

a回滾、b寫入

a回滾、b回滾

a回滾、b回滾

not_supported

a寫入、b回滾

never

a寫入、b回滾

never

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b回滾

a回滾、b寫入

a回滾、b寫入

a回滾、b回滾

a回滾、b回滾

spring事務傳播機制

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

spring事務傳播機制

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

spring事務傳播機制

spring事務傳播機制 1 propagation required 支援當前事務,如果當前不存在事務,則新建乙個事務 2 propagation requires new 不論當前有沒有事務,直接新建乙個事務 3 propagation support 支援當前事務,如果當前存在事務,則加入該事...