中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

spring中事務傳播行為有哪些

發布時間:2021-11-17 10:09:09 來源:億速云 閱讀:144 作者:小新 欄目:大數據

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

事務傳播行為整理

spring 的七中傳播行為

  • PROPAGATION_REQUIRED

    • 標識當前方法必須在事務中執行

  • PROPAGATION_SUPPORTS

    • 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。

  • PROPAGATION_MANDATORY

    • 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。

  • PROPAGATION_REQUIRES_NEW

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

  • PROPAGATION_NOT_SUPPORTED

    • PROPAGATION_NOT_SUPPORTED 總是非事務地執行,并掛起任何存在的事務。

  • PROPAGATION_NEVER

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

  • PROPAGATION_NESTED

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

PROPAGATION_REQUIRED

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

(1)調用methodB,因為當前上下文中沒有事務,所以會新建一個事務。

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

PROPAGATION_SUPPORTS

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

(1) 調用methodB,則以非事務的方法執行。

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

PROPAGATION_MANDATORY

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

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

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

PROPAGATION_REQUIRES_NEW

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

(1) 調用methodB會開啟一個新的事務。

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

PROPAGATION_NOT_SUPPORTED

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

(1) 執行methodB。無事務。

(2) 執行methodA。當執行到方法B時,事務會被掛起,以非事務的方式執行methodB,然后事務恢復。

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

PROPAGATION_NEVER

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

(1) 單獨執行methodB, 非事務執行。

(2) 執行 methodA ,當執行到methodB時,會拋出異常。

PROPAGATION_NESTED

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

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尖扎县| 偃师市| 石林| 搜索| 仙游县| 平塘县| 潮安县| 盐城市| 泰州市| 甘泉县| 新兴县| 池州市| 元朗区| 华容县| 南开区| 江油市| 固安县| 利津县| 榆林市| 延吉市| 杂多县| 饶河县| 犍为县| 汉源县| 怀集县| 平原县| 乐昌市| 乐陵市| 辰溪县| 大方县| 恩平市| 金阳县| 浦城县| 高邑县| 周至县| 资兴市| 东宁县| 巫山县| 克山县| 舞阳县| 沙田区|