Spring中的事務傳播行為有哪些?
今天,我給大家分享一下,我對Spring傳播行為的理解。
1、事務傳播行為
在日常開發中,我們經常會存在多個聲明了事務的方法相互調用,在這種情況下,會存在嵌套兩個或兩個以上事務的情況,所謂事務傳播行為就是指這些事務之間的傳播規則。來看這樣一段代碼:
@Transaction(Propagation = REQUIRED_NEW)
public void methodA(){
}
@Transaction(Propagation = REQUIRED)
public void methodB(){
methodA();
}
在這段代碼中,methodB()調用了methodA(),兩個方法都顯示的開啟了事務。methodA()是開啟一個新事務,還是繼續在methodB()這個事務中執行?就取決于事務的傳播行為規則的定義。
2、事務嵌套
事務嵌套是指兩個或兩個以上開啟的事務的方法嵌套調用,在這種情況下,需要制定這些事務之間的傳播行為規則。在Spring中,一共定義了7種內置的事務嵌套傳播行為:
第1種:REQUIRED,它是Spring默認的事務傳播行為。表示如果當前存在事務,則加入這個事務,如果不存在事務,就新建一個事務。
第2種:REQUIRE_NEW:表示不管是否存在事務,都會新建一個事務,新建的事務和原來已經定義的事務相互獨立。外部事務拋出異常回滾不會影響內部事務的正常提交。
第3種:NESTED:如果當前存在事務,則嵌套在當前事務中執行。如果當前沒有事務, 則新建一個事務,類似于REQUIRE_NEW。
第4種:SUPPORTS:表示支持當前事務,如果當前不存在事務,以非事務的方式執行。
第5種:NOT_SUPPORTED:表示以非事務的方式來運行,如果當前存在事務,則把當前事務掛起。
第6種:MANDATORY:強制事務執行,若當前不存在事務,則拋出異常.
第7種:NEVER:以非事務的方式執行,如果當前存在事務,則拋出異常。
Spring事務傳播一般不需要開發人員顯式定義,默認就是PROPAGATION_REQUIRED,只要在嵌套事務的情況下需要重點了解。