Transactional配置詳解

2021-08-19 11:12:13 字數 2226 閱讀 8431

1、事務的7種屬性

propagation_required -- 支援當前事務,如果當前沒有事務,就新建乙個事務。,預設配置,也是常用的選擇。

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

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

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

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

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

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

@transactional的預設配置是propagation_required,原始碼如下:

2、每個配置的作用

注:類內部方法呼叫類內部的其他方法,子方法並會不引起事務行為,所以以下用兩個類中的兩個方法進行講解事務。

serivcea中的方法methoda,serviceb中的方法methodb

如果當前有事務,則按照當前事務處理;如果當前沒有事務,就新建乙個事務。

例如methoda中呼叫methodb,methodb的事務配置為propagation_required,那麼如果methoda方法上有事務,那麼methodb發現methoda有事務,則不會再建立事務,直接事務使用methoda的事務。如果methoda方法上沒有事務,那麼methodb會自己建立乙個事務,只對methodb方法體中加入事務管理。

如果當前有事務,則按照當前事務處理;如果當前沒有事務,就按照沒有事務處理。

例如methoda中呼叫methodb,methodb的事務配置為propagation_supports,那麼如果methoda方法上有事務,那麼methodb直接事務使用methoda的事務。如果methoda方法上沒有事務,那麼methodb方法體中也沒有事務。

如果當前有事務,則按照當前事務處理;如果當前沒有事務,就丟擲異常。

例如methoda中呼叫methodb,methodb的事務配置為propagation_mandatory

,那麼如果methoda方法上有事務,那麼methodb直接事務使用methoda的事務。如果methoda方法上沒有事務,那麼直接丟擲異常。

不管當前是否有事務,都新建乙個新的事務。

例如methoda中呼叫methodb,methodb的事務配置為propagation_required

_new,那麼如果methoda方法上有事務,那麼執行到methodb直接新建乙個事務,把methoda的事務掛起,等待methodb的事務執行完畢,再進行執行methoda的事務。這樣就存在兩個事務,如果methodb已經提交,那麼methoda失敗回滾,methodb是不會回滾的;如果methodb失敗回滾,他丟擲的異常被demoservicea.demomethoda捕獲,methoda事務仍然可以提交。如果methoda方法上沒有事務,那麼新建事務執行。

不管當前是否有事務

;都按照沒有事務處理。

例如methoda中呼叫methodb,methodb的事務配置為propagation_

not_supported

,那麼如果methoda方法上有事務,那麼執行到methodb時,methoda

的事務掛起,methodb

按照無事務處理,執行完後在執行methoda。如果methoda方法上沒有事務,直接methodb方法體中也沒有事務。

如果當前有事務,則丟擲異常;如果當前沒有事務,就按照沒有事務

正常執行。

例如methoda中呼叫methodb,methodb的事務配置為propagation_never

,那麼如果methoda方法上有事務,那麼直接丟擲異常

。如果methoda方法上沒有事務,那麼按照沒有事務正常執行。

我認為和propagation_required

基本一致,有詳細了解過的可以補充。

Transactional註解初見

之前一直使用宣告式事務,切面程式設計的配置方式讓程式設計者忘記了事務的存在,一旦離開,發現這個事務還是蠻重要的 public inte ce userservice transactional public class userserviceimpl implements userservice p...

Transactional註解詳解

預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new exception 不會回滾 指定回滾 transactional rollbackfor exception.class public void methodname 指定不回滾 transacti...

Spring中 Transactional的使用

1.在需要事務管理的地方加 transactional註解,transactional 註解可以被應用於介面定義和介面方法 類定義和類的 public 方法上.2.transactional 註解只能應用到 public 可見度的方法上,如果你在 protected private 或者 packa...