日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

对Spring事务一些问题的讨论

發(fā)布時間:2024/4/14 javascript 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对Spring事务一些问题的讨论 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  提起spring事務(wù),就會讓人聯(lián)想起四大基本特征,五個隔離級別,七大傳播特性。相信大多數(shù)人都知道這些東西,但是知道是一回事情,能用好真的是另一回事了。在使用Spring事務(wù)的時候,我曾遇到過幾個比較嚴(yán)肅的問題,在這里我做一個自我總結(jié)。

?

問題一、 propagation.NESTED和propagation.REQUIRED_NEW有什么區(qū)別?

  當(dāng)調(diào)用方不存在事務(wù)的時候,兩者的效果是一致的。所以這里討論問題的前提是調(diào)用方存在事務(wù)。PROPAGATION_REQUIRES_NEW 啟動一個新的, 不依賴于環(huán)境的 "內(nèi)部" 事務(wù). 這個事務(wù)將被完全 commited 或 rolled back 而不依賴于外部事務(wù), 它擁有自己的隔離范圍, 自己的鎖, 等等. 當(dāng)內(nèi)部事務(wù)開始執(zhí)行時, 外部事務(wù)將被掛起, 內(nèi)務(wù)事務(wù)結(jié)束時, 外部事務(wù)將繼續(xù)執(zhí)行.?
另一方面, PROPAGATION_NESTED 開始一個 "嵌套的" 事務(wù), 它是已經(jīng)存在事務(wù)的一個真正的子事務(wù). 潛套事務(wù)開始執(zhí)行時, 它將取得一個 savepoint. 如果這個嵌套事務(wù)失敗, 我們將回滾到此 savepoint. 潛套事務(wù)是外部事務(wù)的一部分, 只有外部事務(wù)結(jié)束后它才會被提交.?
由此可見, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大區(qū)別在于, PROPAGATION_REQUIRES_NEW 完全是一個新的事務(wù), 而 PROPAGATION_NESTED 則是外部事務(wù)的子事務(wù), 如果外部事務(wù) commit, 嵌套事務(wù)也會被 commit, 這個規(guī)則同樣適用于 roll back.?

?

問題二、 @Transactional為什么會失效?

  1.調(diào)用方和被調(diào)用方屬于同一個component,被調(diào)用方的?@Transacational注解無效

  

package com.transacational;import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional;/*** Created by chenqimiao on 17/10/31.*/ @Component public class Service {public void test1(){test2();}@Transactional//此處的注解無效public void test2(){} }

?

  2.被調(diào)用方不是一個public方法,被調(diào)用方的?@Transacational注解無效  

@Component public class Service {@Resourceprivate Service1 service1;public void test1(){test2();service1.test3();}@Transactional//1.此處的注解無效public void test2(){} }

?

package com.transacational;import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional;/*** Created by chenqimiao on 17/10/31.*/ @Component public class Service1 {@Transactional//2.此處注解無效protected void test3(){} }

?

  

  3.未開啟事務(wù)開關(guān),如:在SpringBoot中,啟動類未使用?@EnableTransactionManagement

?

?

問題三、 如何理解@Transactional的超時時間?

  ?timeout是一個供開發(fā)者設(shè)置超時時間的屬性。默認(rèn)值-1,超時時間由具體的sql系統(tǒng)決定。  ?

/*** Created by chenqimiao on 17/10/31.*/ @Component public class Service3 {@Resourceprivate AdminInfoDoMapper adminInfoDoMapper;@Transactional(timeout = 4)//并不會超時public void test4(){adminInfoDoMapper.selectNameById(1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}} }

?

超時時間具體的定義:事務(wù)開始(在該方法第一句代碼執(zhí)行之前)到最后一個Statement執(zhí)行完畢

所以象下面這樣寫,事務(wù)就會超時

@Component public class Service3 {@Resourceprivate AdminInfoDoMapper adminInfoDoMapper;@Transactional(timeout = 4)public void test4(){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}adminInfoDoMapper.selectNameById(1);} }

?

?

?

問題四、 @Transactional默認(rèn)的回滾策略?

默認(rèn)情況下,只有當(dāng)RuntimeException或其子類的異常被事務(wù)捕獲之后,事務(wù)才會回滾,如果要讓事務(wù)能夠回滾所有異常,必須手動指定??@Transactional(rollbackFor=Exception.class)??,這樣繼承Exception的子類或者Exception本身都可以讓事務(wù)回滾。

轉(zhuǎn)載于:https://www.cnblogs.com/think-in-java/p/7764910.html

總結(jié)

以上是生活随笔為你收集整理的对Spring事务一些问题的讨论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。