spring 事務傳播性

2022-09-09 23:27:42 字數 3118 閱讀 6407

大白話講就是,方法之間互相呼叫的時候,事務如何傳播,比如a()呼叫b(),b()的事務是和a()共用乙個事務(失敗一起提交)?

還是新事務(兩者事務互不影響)?,還是說b()不需要事務?,這就是事務傳播性的意思。

@transactional()

public void methoda()

@transactional()

public void methodb()

**中的methodb()預設的傳播性是required,表示和methoda共用乙個事務,要提交一起提交,要失敗一起回滾。

事務傳播性

說明required

預設傳播性,如果當前有事務,就沿用當前事務,如果沒有就新建乙個事務

supports

支援當前事務,如果當前沒有事務,就以非事務執行

requires_new

新建乙個事務,如果當前存在事務,就把當前事務掛起

not_supported

不支援事務,如果當前存在事務,就把當前事務掛起。

mandatory

強制使用當前事務,如果當前沒有事務就拋異常

never

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

nested

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

1.required

說明:支援當前事務,如果當前沒有事務就新建乙個事務

insertuser()和insertstu是共用乙個事務,要提交一起提交要失敗一起失敗。

@transactional(propagation = propagation.required)

public void insertuser(string name)

stuservice中

@transactional(propagation = propagation.required)

public void insertstu(string name)

2.requires_new

說明:開啟新的事務,如果當前存在事務,就掛起當前事務。

insertuser()的失敗回滾,不會導致insertstu的回滾,因為insertstu()在乙個新的事務中。

@transactional(propagation = propagation.required)

public void insertuser(string name)

//上面的方法拋異常事務的回滾,不會導致下面事務回滾,stu插入成功,user插入失敗

@transactional(propagation = propagation.requires_new)

public void insertstu(string name)

3.supports

說明:如果當前已經存在事務,那麼加入該事務,否則建立乙個所謂的空事務(可以認為無事務執行)

insertuser是以非事務執行的,所以insertstu也是沒有事務的,所以兩個儲存都會成功

但是如果給inertstu加上@transactional(propagation = propagation.required)insertstu是有事務的。

public void insertuser(string name) 

@transactional(propagation = propagation.supports)

public void insertstu(string name)

4.not_supported

說明:不支援事務,如果當前存在事務,掛起當前事務,然後新的方法在沒有事務的環境中執行

下面的insertuser會回滾,insertstu將以非事務執行,所以不會回滾

這種的業務場景可能是,日誌寫入事務要和主事務隔離,外層事務寫入失敗,不影響日誌的寫入。

@transactional(propagation = propagation.required)

public void insertuser(string name)

@transactional(propagation = propagation.not_supported)

public void insertstu(string name)

5.mandatory

說明:當前必須存在乙個事務,否則丟擲異常。

因為insertuser()沒有配置事務,所以insertstu()會報錯。

異常資訊:no existing transaction found for transaction marked with propagation 'mandatory'

public void insertuser(string name) 

@transactional(propagation = propagation.mandatory)

public void insertstu(string name)

6.never

說明:不支援事務,如果當前存在事務,就丟擲異常。

因為insertuser()配置了事務,所以在insertstu中會報錯。

異常資訊:existing transaction found for transaction marked with propagation 'never'

@transactional(propagation = propagation.required)

public void insertuser(string name)

@transactional(propagation = propagation.never)

public void insertstu(string name)

7.nested

說明:nested修飾的內部方法屬於外部事務的子事務,外圍主事務回滾,子事務一定回滾,而內部子事務可以單獨回滾而不影響外圍主事務和其他子事務

主要的場景可能是,下單的時候,送積分,如果下單失敗,送積分也要回滾,但送積分失敗不影響下單失敗。這種場景可以使用這種傳播性

spring事務的傳播性

spring事務的傳播行為 1.propagation manatory 強制使用當前事務,如果當前沒有事務,就會丟擲乙個異常 2.propagation nested 如果當前存在事務,則在該事務內巢狀執行 巢狀執行時屬於該事務的子事務,當外層事務提交時,子事務跟著提交 子事務提交或回滾不會影響外...

spring事務傳播

採用程式設計式事務 1 getcurrentsession 與opensession 的區別?採用getcurrentsession 建立的session會繫結到當前執行緒中,而採用opensession 建立的session則不會 採用getcurrentsession 建立的session在co...

Spring事務傳播

required 預設 如果當前存在事務,就加入該事務,如果不存在,則建立乙個新的事務 supports 如果呼叫者有事務,則加入該事務,如果沒有,則以非事務方式執行 mandatory 如果存在事務,則加入該事務,如果不存在事務,則拋異常 requires new 重新建立乙個新的事務,如果當前存...