深入理解Spring事務的傳播行為

2021-10-01 01:31:11 字數 2802 閱讀 9489

本文主要介紹下spring事務中的傳播行為。

spring中的7個事務傳播行為:

事務行為

說明propagation_required

支援當前事務,假設當前沒有事務。就新建乙個事務

propagation_supports

支援當前事務,假設當前沒有事務,就以非事務方式執行

propagation_mandatory

支援當前事務,假設當前沒有事務,就丟擲異常

propagation_requires_new

新建事務,假設當前存在事務。把當前事務掛起

propagation_not_supported

以非事務方式執行操作。假設當前存在事務,就把當前事務掛起

propagation_never

以非事務方式執行,假設當前存在事務,則丟擲異常

propagation_nested

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

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類似的操作。

@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沒有宣告事務,那就不用事務.

深入理解spring事務

事務介紹 乙個事務要麼同時成功,要麼同時失敗 特性事務隔離級別 傳播行為 唯讀事務只進行讀取操作 readonly true 告訴spring當前事務只會進行讀取操作,不會進行修改操作,可以幫助資料庫引擎優化 注 如果設定為唯讀的話,千萬不要在事務裡修改資料,使用唯讀操作時,spring不會進行加鎖...

深入理解Spring事務(初步)

簡括 資料庫事務 transaction 是訪問並可能操作各種資料項的乙個資料庫操作序列,這些操作要麼全部執行,要麼全部不執行,是乙個不可分割的工作單位。事務由事務開始與事務結束之間執行的全部資料庫操作組成。作用 保證資料的一致性。原子性 不可分割 一致性 資料一致 隔離性 互不影響 永續性 永久儲...

深入理解MyBatis MyBatis事務

mybatis可以通過xml配置檔案設定是否進行事務管理,事務管理主要包括事務的提交,回滾等 本文主要介紹了事務的入口,mybatis事務操作對資料庫select操作和update操作的影響等 個人主頁 tuzhenyu s page string resource mybatis config.x...