您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)spring中事務(wù)傳播行為有哪些的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
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í)行。
@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ù)中。
@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ù)中。
@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ù)中。
@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é)果卻被回滾了
@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回滾。
@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時,會拋出異常。
@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é)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(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)容。