溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring中事務(wù)傳播行為有哪些

發(fā)布時間:2021-11-17 10:09:09 來源:億速云 閱讀:134 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)spring中事務(wù)傳播行為有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

事務(wù)傳播行為整理

spring 的七中傳播行為

  • PROPAGATION_REQUIRED

    • 標(biāo)識當(dāng)前方法必須在事務(wù)中執(zhí)行

  • PROPAGATION_SUPPORTS

    • 如果存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有事務(wù),則非事務(wù)的執(zhí)行。

  • PROPAGATION_MANDATORY

    • 如果已經(jīng)存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有一個活動的事務(wù),則拋出異常。

  • PROPAGATION_REQUIRES_NEW

    • 使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作為事務(wù)管理器。 它會開啟一個新的事務(wù)。如果一個事務(wù)已經(jīng)存在,則先將這個存在的事務(wù)掛起。

  • PROPAGATION_NOT_SUPPORTED

    • PROPAGATION_NOT_SUPPORTED 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。

  • PROPAGATION_NEVER

    • 總是非事務(wù)地執(zhí)行,如果存在一個活動事務(wù),則拋出異常。

  • PROPAGATION_NESTED

    • 如果一個活動的事務(wù)存在,則運行在一個嵌套的事務(wù)中。 如果沒有活動事務(wù), 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行。

PROPAGATION_REQUIRED

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // do something
}

(1)調(diào)用methodB,因為當(dāng)前上下文中沒有事務(wù),所以會新建一個事務(wù)。

(2)調(diào)用methodA,因為當(dāng)前上下文中沒有事務(wù),所以會新建一個事務(wù)。但是,當(dāng)執(zhí)行到methodB時,方法B會被加入到methodA的事務(wù)中。

PROPAGATION_SUPPORTS

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事務(wù)屬性為SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}

(1) 調(diào)用methodB,則以非事務(wù)的方法執(zhí)行。

(2) 調(diào)用methodA,上下文沒有事務(wù),新建一個,而執(zhí)行到methodB時,它自動加入到methodA的事務(wù)中。

PROPAGATION_MANDATORY

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事務(wù)屬性為MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // do something

(1) 調(diào)用methodB時,上下文中沒有事務(wù),則會拋出異常。

(2) 調(diào)用methodA,上下文沒有事務(wù),新建一個,而執(zhí)行到methodB時,它自動加入到methodA的事務(wù)中。

PROPAGATION_REQUIRES_NEW

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    doSomeThingA();
    methodB();
    doSomeThingB();
	// do something else
}
 
 
// 事務(wù)屬性為REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // do something
}

(1) 調(diào)用methodB會開啟一個新的事務(wù)。

(2) 調(diào)用methodA時,methodA會開啟事務(wù),methodB也會開啟一個新的事務(wù),但是這兩個事務(wù)互相獨立。也就是說,如果methodA方法在調(diào)用methodB方法后的doSomeThingB方法失敗了,而methodB方法所做的結(jié)果依然被提交。而除了 methodB之外的其它代碼導(dǎo)致的結(jié)果卻被回滾了

PROPAGATION_NOT_SUPPORTED

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    doSomeThingA();
    methodB();
    doSomeThingB();
	// do something else
}
 
 
// 事務(wù)屬性為PROPAGATION_NOT_SUPPORTED 
@Transactional(propagation = Propagation.PROPAGATION_NOT_SUPPORTED)
public void methodB() {
    // do something
}

(1) 執(zhí)行methodB。無事務(wù)。

(2) 執(zhí)行methodA。當(dāng)執(zhí)行到方法B時,事務(wù)會被掛起,以非事務(wù)的方式執(zhí)行methodB,然后事務(wù)恢復(fù)。

也就是methodB中有異常時,B不回滾,A回滾。

PROPAGATION_NEVER

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事務(wù)屬性為SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}

(1) 單獨執(zhí)行methodB, 非事務(wù)執(zhí)行。

(2) 執(zhí)行 methodA ,當(dāng)執(zhí)行到methodB時,會拋出異常。

PROPAGATION_NESTED

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    doSomeThingA();
 	methodB();
    doSomeThingB();
	// do something
}
 
// 事務(wù)屬性為NEWSTED
@Transactional(propagation = Propagation.NEWSTED)
public void methodB() {
    // do something
}

(1)單獨執(zhí)行methodB,則會開啟一個事務(wù)。

(2)執(zhí)行methodA,如果methodA的事務(wù)執(zhí)行失敗后,會回滾內(nèi)部的methodB事務(wù)。但是,methodB事務(wù)執(zhí)行失敗后,并不會引起外層methodA事務(wù)的回滾。

感謝各位的閱讀!關(guān)于“spring中事務(wù)傳播行為有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI