欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的嵌套事務(wù)(Propagation.NESTED)到底是個(gè)啥案例代碼講解

 更新時(shí)間:2023年01月07日 14:55:00   作者:多動(dòng)手,勤思考  
SavePoint是數(shù)據(jù)庫(kù)事務(wù)中的一個(gè)概念,?可以將整個(gè)事務(wù)切割為不同的小事務(wù),可以選擇將狀態(tài)回滾到某個(gè)小事務(wù)發(fā)生時(shí)的樣子,本文通過(guò)案例代碼講解Spring的嵌套事務(wù)(Propagation.NESTED)到底是個(gè)啥,感興趣的朋友跟隨小編一起看看吧

什么是嵌套事務(wù)

嵌套事務(wù)其實(shí)是對(duì)數(shù)據(jù)庫(kù)SavePoint概念的Java操作版封裝,什么是SavePoint參考我另一篇文章:http://www.dbjr.com.cn/article/272004.htm

SavePoint是數(shù)據(jù)庫(kù)事務(wù)中的一個(gè)概念, 可以將整個(gè)事務(wù)切割為不同的小事務(wù), 可以選擇將狀態(tài)回滾到某個(gè)小事務(wù)發(fā)生時(shí)的樣子。

Propagation.NESTED 則是外部事務(wù)的子事務(wù), 如果外部事務(wù) commit, 嵌套事務(wù)也會(huì)被 commit, 這個(gè)規(guī)則同樣適用于rollback.

嵌套事務(wù)開始執(zhí)行時(shí),  它將取得一個(gè) savepoint, 如果這個(gè)嵌套事務(wù)失敗, 我們將回滾到此 savepoint,嵌套事務(wù)是外部事務(wù)的一部分, 只有外部事務(wù)結(jié)束后它才會(huì)被提交.

案例

偽代碼如下:

ServiceA {  
      
    /** 
     * 事務(wù)屬性配置為 PROPAGATION_REQUIRED 
     */  
    void methodA() {  
        try {
          DML......
          ServiceB.methodB();  
        } catch(...) ...
        DML....
    }  
  
}  
  
ServiceB {  
      
    /** 
     * 事務(wù)屬性配置為 PROPAGATION_NESTED 
     */   
    void methodB() {  
    }  
     
}     

如上代碼,當(dāng)methodB開始執(zhí)行時(shí),spring會(huì)在數(shù)據(jù)庫(kù)中生成一個(gè)SavePoint,methodB失敗被spring捕捉到時(shí),會(huì)回滾該SavePoint,將methodB中對(duì)數(shù)據(jù)庫(kù)的操作全部回滾到SavePoint之前,

注意methodA中加入了try catch,引入你的代碼如果希望methodB作為一個(gè)局部性的事務(wù)拋出異常失敗后,不影響A的外圍事務(wù),那么就不能讓異常繼續(xù)往上拋,否則A這個(gè)外圍事務(wù)也會(huì)被全部回滾,因此要在A中自行消化這個(gè)異常,

說(shuō)到這里其實(shí)可以總結(jié)一下,嵌套事務(wù)就是spring像對(duì)正常事務(wù)一樣,幫助我們捕捉SavePoint小事務(wù)的異常并進(jìn)行自動(dòng)回滾,免去我們?cè)贘ava代碼中使用SavePoint時(shí)想要回滾的手動(dòng)操作,只是前者是一個(gè)正常的大事務(wù)回滾,后者是大事務(wù)中的小事務(wù)回滾。

下面是實(shí)際測(cè)試代碼,我們?cè)诒4鎘ey的時(shí)候,也保存一個(gè)value,但是保存value時(shí)我們拋出exception,并且在保存key的地方catch?。?/p>

image.png

image.png

這里是保存前的db,都是空表:

image.png

image.png

操作后,可以看到key表保存進(jìn)去,value表沒保存進(jìn)去:

image.png

image.png

這里有人會(huì)說(shuō),key表保存進(jìn)去是因?yàn)槲覀冏约撼粤水惓#瑳]有被spring捕獲到,事務(wù)提交了,所以key表保存進(jìn)去了,value表只是因?yàn)楸籹pring捕獲到了而已,是不是和嵌套事務(wù)沒關(guān)系?那我們改一下value的事務(wù)行為,也使用默認(rèn)方式,代碼如下,并且我們把上面保存進(jìn)db的數(shù)據(jù)清空,方便查看效果:

image.png

執(zhí)行后查看數(shù)據(jù)庫(kù), 空空如也:

image.png

image.png

我們?cè)倏磍og,spring出了一個(gè) Transaction rolled back because it has been marked as rollback-only 的錯(cuò)誤,這是什么原因呢? 更改了事務(wù)行為后就出現(xiàn)這種,

其實(shí)原因很簡(jiǎn)單,因?yàn)閮蓚€(gè)service都是用默認(rèn)行為,那么他們同屬一個(gè)事務(wù),spring檢測(cè)到了value的方法發(fā)生了錯(cuò)誤后,會(huì)將事務(wù)標(biāo)記為 rollback-only,意味著本次事務(wù)發(fā)生了錯(cuò)誤必須回滾,后續(xù)如果嘗試提交此事務(wù),就會(huì)提示下面的錯(cuò)誤信息,

但是我們上面使用嵌套事務(wù)時(shí),并沒有發(fā)生這種情況,因?yàn)楸4鎣alue時(shí),創(chuàng)建了一個(gè)SavePoint,spring捕捉到錯(cuò)誤后回滾這個(gè)SavePoint,并不會(huì)將事務(wù)標(biāo)記為錯(cuò)誤回滾,后續(xù)key地方catch了這個(gè)錯(cuò)誤,是可以正常提交此事務(wù)的。

image.png

SavePoint和嵌套事務(wù)在實(shí)際應(yīng)用中場(chǎng)景不多,了解一下如果將來(lái)真有需要的話 可以派上用場(chǎng)。

這里有篇文章講解使用@Transactional 設(shè)置嵌套事務(wù)不回滾。

到此這篇關(guān)于Spring的嵌套事務(wù)(Propagation.NESTED)到底是個(gè)啥案例代碼講解的文章就介紹到這了,更多相關(guān)Spring嵌套事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)變更文件查詢的方法

    java實(shí)現(xiàn)變更文件查詢的方法

    這篇文章主要介紹了java實(shí)現(xiàn)變更文件查詢的方法,可通過(guò)java查詢文件最后修改時(shí)間的方法實(shí)現(xiàn)查找變更文件的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java延時(shí)的3種實(shí)現(xiàn)方法舉例

    Java延時(shí)的3種實(shí)現(xiàn)方法舉例

    這篇文章主要給大家介紹了關(guān)于Java延時(shí)的3種實(shí)現(xiàn)方法舉例,java開發(fā)中常會(huì)用到延時(shí)任務(wù),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化

    Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化

    我們?cè)陂_發(fā)中難免和JSON打交道,這不小編最近遇到了,需要把一些信息轉(zhuǎn)成JSON字符串,下面這篇文章主要給大家介紹了關(guān)于Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化,需要的朋友可以參考下
    2023-04-04
  • 源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)總結(jié)

    源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了關(guān)于源碼解析Spring 數(shù)據(jù)庫(kù)異常抽理知識(shí)點(diǎn)內(nèi)容,對(duì)此有需要的朋友們學(xué)習(xí)參考下。
    2019-05-05
  • Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析

    Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析

    這篇文章主要為大家介紹了Netty分布式固定長(zhǎng)度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 一文搞懂Spring中Bean的生命周期

    一文搞懂Spring中Bean的生命周期

    這篇文章主要為大家介紹了Spring中Bean生命周期的使用及控制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的可以學(xué)習(xí)一下
    2022-06-06
  • RestTemplate接口調(diào)用神器常見用法匯總

    RestTemplate接口調(diào)用神器常見用法匯總

    這篇文章主要介紹了RestTemplate接口調(diào)用神器常見用法匯總,通過(guò)案例代碼詳細(xì)介紹RestTemplate接口調(diào)用神器常見用法,需要的朋友可以參考下
    2022-07-07
  • Java基礎(chǔ)之垃圾回收機(jī)制詳解

    Java基礎(chǔ)之垃圾回收機(jī)制詳解

    這篇文章主要介紹了Java基礎(chǔ)之垃圾回收機(jī)制詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java解釋器的運(yùn)行過(guò)程介紹

    Java解釋器的運(yùn)行過(guò)程介紹

    今天小編就為大家分享一篇關(guān)于Java解釋器的運(yùn)行過(guò)程介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • maven學(xué)習(xí)-初窺門徑

    maven學(xué)習(xí)-初窺門徑

    這篇文章主要介紹了maven的簡(jiǎn)單知識(shí),介紹了maven的定義及核心功能,具有一定參考價(jià)值,大家可以了解下。
    2017-10-10

最新評(píng)論