這篇文章給大家分享的是有關(guān)spring中事務(wù)傳播行為有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)10年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:陽(yáng)光房等企業(yè),備受客戶表?yè)P(yáng)。
spring 的七中傳播行為
PROPAGATION_REQUIRED
標(biāo)識(shí)當(dāng)前方法必須在事務(wù)中執(zhí)行
PROPAGATION_SUPPORTS
如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒有事務(wù),則非事務(wù)的執(zhí)行。
PROPAGATION_MANDATORY
如果已經(jīng)存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒有一個(gè)活動(dòng)的事務(wù),則拋出異常。
PROPAGATION_REQUIRES_NEW
使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作為事務(wù)管理器。 它會(huì)開啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則先將這個(gè)存在的事務(wù)掛起。
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NOT_SUPPORTED 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。
PROPAGATION_NEVER
總是非事務(wù)地執(zhí)行,如果存在一個(gè)活動(dòng)事務(wù),則拋出異常。
PROPAGATION_NESTED
如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中。 如果沒有活動(dòng)事務(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,因?yàn)楫?dāng)前上下文中沒有事務(wù),所以會(huì)新建一個(gè)事務(wù)。
(2)調(diào)用methodA,因?yàn)楫?dāng)前上下文中沒有事務(wù),所以會(huì)新建一個(gè)事務(wù)。但是,當(dāng)執(zhí)行到methodB時(shí),方法B會(huì)被加入到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ù),新建一個(gè),而執(zhí)行到methodB時(shí),它自動(dòng)加入到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時(shí),上下文中沒有事務(wù),則會(huì)拋出異常。
(2) 調(diào)用methodA,上下文沒有事務(wù),新建一個(gè),而執(zhí)行到methodB時(shí),它自動(dòng)加入到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會(huì)開啟一個(gè)新的事務(wù)。
(2) 調(diào)用methodA時(shí),methodA會(huì)開啟事務(wù),methodB也會(huì)開啟一個(gè)新的事務(wù),但是這兩個(gè)事務(wù)互相獨(dú)立。也就是說(shuō),如果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ú)事務(wù)。
(2) 執(zhí)行methodA。當(dāng)執(zhí)行到方法B時(shí),事務(wù)會(huì)被掛起,以非事務(wù)的方式執(zhí)行methodB,然后事務(wù)恢復(fù)。
也就是methodB中有異常時(shí),B不回滾,A回滾。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { methodB(); // do something } // 事務(wù)屬性為SUPPORTS @Transactional(propagation = Propagation.SUPPORTS) public void methodB() { // do something }
(1) 單獨(dú)執(zhí)行methodB, 非事務(wù)執(zhí)行。
(2) 執(zhí)行 methodA ,當(dāng)執(zhí)行到methodB時(shí),會(huì)拋出異常。
@Transactional(propagation = Propagation.REQUIRED) public void methodA() { doSomeThingA(); methodB(); doSomeThingB(); // do something } // 事務(wù)屬性為NEWSTED @Transactional(propagation = Propagation.NEWSTED) public void methodB() { // do something }
(1)單獨(dú)執(zhí)行methodB,則會(huì)開啟一個(gè)事務(wù)。
(2)執(zhí)行methodA,如果methodA的事務(wù)執(zhí)行失敗后,會(huì)回滾內(nèi)部的methodB事務(wù)。但是,methodB事務(wù)執(zhí)行失敗后,并不會(huì)引起外層methodA事務(wù)的回滾。
感謝各位的閱讀!關(guān)于“spring中事務(wù)傳播行為有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
分享文章:spring中事務(wù)傳播行為有哪些
網(wǎng)頁(yè)鏈接:http://www.rwnh.cn/article8/igpdop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、Google、小程序開發(fā)、App開發(fā)、云服務(wù)器、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)