Spring的七個事務傳播行為,spring七個事務
Spring的七個事務傳播行為Spring事務種類Spring事務含有七個層級,分別如下:REQUIREDREQUIRED是Spring的預設事務層級,如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務,具體表現在方法上加入註解@Transactional(rollbackFor=Exception.class,propagation = Propagation.REQUIRED),以下幾個層級相同。SUPPORTS如果存在一個事務,支援當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的交易管理員,SUPPORTS與不使用事務有少許不同。
MANDATORY如果已經存在一個事務,支援當前事務。如果沒有一個活動的事務,則拋出異常。
REQUIRES_NEW總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。NOT_SUPPORTED總是非事務地執行,並掛起任何存在的事務。
NEVER總是非事務地執行,如果存在一個活動事務,則拋出異常
NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按REQUIRED 屬性執行
資料驗證根據上一篇部落格Spring boot 用mybatis串連資料庫的例子,不斷改變事務層級得到以下資料
調用方法A事務 |
被呼叫者法B事務 |
A方法是否捕獲B方法 |
調用方法A拋出異常 |
被呼叫者法B拋出異常 |
調用方法資料是否入庫 |
被呼叫者法資料是否入庫 |
結論 |
REQUIRED |
REQUIRED |
否 |
否 |
是 |
否 |
否 |
兩個方法在同一個事務中,如果上下文有事務則加入其中,如果沒有則建立新事務。 |
REQUIRED |
REQUIRED |
是 |
否 |
是 |
否 |
否 |
REQUIRED |
SUPPORTS |
否 |
否 |
是 |
否 |
否 |
當上下文有事務時,則加入事務中,如果沒有事務則執行無事務操作, 即時被呼叫者法出錯了也不會有復原操作 |
NEVER |
SUPPORTS |
否 |
否 |
是 |
是 |
是 |
REQUIRED |
MANDATORY |
否 |
否 |
是 |
否 |
否 |
報No existing transaction found for transaction marked with propagation 'mandatory'錯誤,說明MANDATORY上下文中有事務時則加入其中,如果沒有則直接報上述錯誤 |
NEVER |
MANDATORY |
否 |
否 |
否 |
是 |
否 |
REQUIRED |
REQUIRES_NEW |
否 |
否 |
是 |
否 |
否 |
REQUIRES_NEW每次都要一個新事務,如果子事務拋出異常並且父事務捕獲了子事務異常,則父事務不復原,否則兩者都要復原;如果父事務調用子事務後父事務拋出異常,則子事務不復原,而父交易回復。 |
REQUIRED |
REQUIRES_NEW |
是 |
否 |
是 |
是 |
否 |
REQUIRED |
REQUIRES_NEW |
否 |
是 |
否 |
否 |
是 |
REQUIRED |
NOT_SUPPORTED |
否 |
否 |
是 |
否 |
是 |
定義了NOT_SUPPORTED事務的方法,不管自己是否出錯都會提交事務,調用方法A如果調用了方法B,並且捕獲了B的異常,則方法A會提交事務,否則復原事務。 |
REQUIRED |
NOT_SUPPORTED |
否 |
是 |
否 |
否 |
是 |
REQUIRED |
NOT_SUPPORTED |
是 |
否 |
是 |
是 |
是 |
REQUIRED |
NEVER |
否 |
否 |
否 |
否 |
否 |
直接報“ Existing transaction found for transaction marked with propagation 'never'”異常 |
REQUIRED |
NESTED |
否 |
否 |
是 |
否 |
否 |
NESTED,嵌套事務,如果子事務發生異常,並且父事務對子事務進行了異常捕獲,則子交易回復,父事務不復原,否則都要復原;只要父事務發生異常,父事務子事務都復原,這個與REQUIRES_NEW不一樣; |
REQUIRED |
NESTED |
是 |
否 |
是 |
是 |
否 |
REQUIRED |
NESTED |
否 |
是 |
否 |
否 |
否 |
|
也可參考http://blog.csdn.net/linuu/article/details/51006780
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。