大白話講就是,方法之間互相呼叫的時候,事務如何傳播,比如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 重新建立乙個新的事務,如果當前存...