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