Spring的嵌套事務(Propagation.NESTED)到底是個啥案例代碼講解
什么是嵌套事務
嵌套事務其實是對數(shù)據(jù)庫SavePoint概念的Java操作版封裝,什么是SavePoint參考我另一篇文章:http://www.dbjr.com.cn/article/272004.htm
SavePoint是數(shù)據(jù)庫事務中的一個概念, 可以將整個事務切割為不同的小事務, 可以選擇將狀態(tài)回滾到某個小事務發(fā)生時的樣子。
Propagation.NESTED 則是外部事務的子事務, 如果外部事務 commit, 嵌套事務也會被 commit, 這個規(guī)則同樣適用于rollback.
嵌套事務開始執(zhí)行時, 它將取得一個 savepoint, 如果這個嵌套事務失敗, 我們將回滾到此 savepoint,嵌套事務是外部事務的一部分, 只有外部事務結(jié)束后它才會被提交.
案例
偽代碼如下:
ServiceA { /** * 事務屬性配置為 PROPAGATION_REQUIRED */ void methodA() { try { DML...... ServiceB.methodB(); } catch(...) ... DML.... } } ServiceB { /** * 事務屬性配置為 PROPAGATION_NESTED */ void methodB() { } }
如上代碼,當methodB開始執(zhí)行時,spring會在數(shù)據(jù)庫中生成一個SavePoint,methodB失敗被spring捕捉到時,會回滾該SavePoint,將methodB中對數(shù)據(jù)庫的操作全部回滾到SavePoint之前,
注意methodA中加入了try catch,引入你的代碼如果希望methodB作為一個局部性的事務拋出異常失敗后,不影響A的外圍事務,那么就不能讓異常繼續(xù)往上拋,否則A這個外圍事務也會被全部回滾,因此要在A中自行消化這個異常,
說到這里其實可以總結(jié)一下,嵌套事務就是spring像對正常事務一樣,幫助我們捕捉SavePoint小事務的異常并進行自動回滾,免去我們在Java代碼中使用SavePoint時想要回滾的手動操作,只是前者是一個正常的大事務回滾,后者是大事務中的小事務回滾。
下面是實際測試代碼,我們在保存key的時候,也保存一個value,但是保存value時我們拋出exception,并且在保存key的地方catch?。?/p>
這里是保存前的db,都是空表:
操作后,可以看到key表保存進去,value表沒保存進去:
這里有人會說,key表保存進去是因為我們自己吃了異常,沒有被spring捕獲到,事務提交了,所以key表保存進去了,value表只是因為被spring捕獲到了而已,是不是和嵌套事務沒關系?那我們改一下value的事務行為,也使用默認方式,代碼如下,并且我們把上面保存進db的數(shù)據(jù)清空,方便查看效果:
執(zhí)行后查看數(shù)據(jù)庫, 空空如也:
我們再看log,spring出了一個 Transaction rolled back because it has been marked as rollback-only 的錯誤,這是什么原因呢? 更改了事務行為后就出現(xiàn)這種,
其實原因很簡單,因為兩個service都是用默認行為,那么他們同屬一個事務,spring檢測到了value的方法發(fā)生了錯誤后,會將事務標記為 rollback-only,意味著本次事務發(fā)生了錯誤必須回滾,后續(xù)如果嘗試提交此事務,就會提示下面的錯誤信息,
但是我們上面使用嵌套事務時,并沒有發(fā)生這種情況,因為保存value時,創(chuàng)建了一個SavePoint,spring捕捉到錯誤后回滾這個SavePoint,并不會將事務標記為錯誤回滾,后續(xù)key地方catch了這個錯誤,是可以正常提交此事務的。
SavePoint和嵌套事務在實際應用中場景不多,了解一下如果將來真有需要的話 可以派上用場。
這里有篇文章講解使用@Transactional 設置嵌套事務不回滾。
到此這篇關于Spring的嵌套事務(Propagation.NESTED)到底是個啥案例代碼講解的文章就介紹到這了,更多相關Spring嵌套事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化
我們在開發(fā)中難免和JSON打交道,這不小編最近遇到了,需要把一些信息轉(zhuǎn)成JSON字符串,下面這篇文章主要給大家介紹了關于Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化,需要的朋友可以參考下2023-04-04源碼解析Spring 數(shù)據(jù)庫異常抽理知識點總結(jié)
在本篇文章里小編給大家分享了關于源碼解析Spring 數(shù)據(jù)庫異常抽理知識點內(nèi)容,對此有需要的朋友們學習參考下。2019-05-05RestTemplate接口調(diào)用神器常見用法匯總
這篇文章主要介紹了RestTemplate接口調(diào)用神器常見用法匯總,通過案例代碼詳細介紹RestTemplate接口調(diào)用神器常見用法,需要的朋友可以參考下2022-07-07