最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot事務(wù)不回滾的解決方案

 更新時間:2022年09月26日 08:38:48   作者:Java中文社群  
這篇文章主要介紹了SpringBoot事務(wù)不回滾的解決方案的相關(guān)資料,需要的朋友可以參考下

在 Spring Boot 中,造成事務(wù)不自動回滾的場景有很多,比如以下這些:

  • 非 public 修飾的方法中的事務(wù)不自動回滾;
  • 當(dāng) @Transactional 遇上 try/catch 事務(wù)不自動回滾;
  • 調(diào)用類內(nèi)部的 @Transactional 方法事務(wù)不自動回滾;
  • 拋出檢查異常時事務(wù)不自動回滾;
  • 數(shù)據(jù)庫不支持事務(wù),事務(wù)也不會自動回滾。

那么對于上面的這些場景,我們應(yīng)該如何解決呢?接下來我們一一來看。

1.非 public 方法解決方案

非 public 方法中事務(wù)不回滾的直接原因是,在非 public 方法上添加的 @Transactional 關(guān)鍵字是無效的,也就是此方法本身是以非事務(wù)的方式運(yùn)行的,所以它當(dāng)然不會自動回滾事務(wù)了。

因為 @Transactional 使用的是 Spring AOP 實現(xiàn)的,而 Spring AOP 是通過動態(tài)代理實現(xiàn)的,而 @Transactional 在生成代理時會判斷,如果方法為非 public 修飾的方法,則不生成代理對象,這樣也就沒辦法自動回滾事務(wù)了,它的部分實現(xiàn)源碼如下:

protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass) {
   // Don't allow no-public methods as required.
   // 非 public 方法,設(shè)置為 null
   if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
      return null;
   }
   // 后面代碼省略....
 }

此問題的解決方案是將方法的權(quán)限修飾符改為 public 即可。

2.try/catch 解決方案

當(dāng)程序中出現(xiàn)了 try/catch 代碼時,事務(wù)不會自動回滾,這是因為 @Transactional 注解在其實現(xiàn)時,需要感知到異常才會自動回滾,而用戶自行在代碼中加入了 try/catch 之后,@Transactional 就無法感知到異常了,那么也就不能自動回滾事務(wù)了。

此問題的解決方案有兩種:一種是在 catch 中將異常重新拋出去,另一種是使用代碼手動將事務(wù)回滾。

解決方案1:將異常重新拋出

解決方案2:使用代碼手動回滾事務(wù)

除了解決方案 1 這種不是很友好的回滾事務(wù)的方式之外,我們還可以選擇更加友好的,不報錯,但可以回滾事務(wù)的方式,其核心實現(xiàn)代碼如下:

3.調(diào)用內(nèi)部 @Transactional 方法解決方案

調(diào)用類內(nèi)部 @Transactional 的方法不自動回滾事務(wù)的原因是,@Transactional 是基于 Spring AOP 實現(xiàn)的,而 Spring AOP 又是基于動態(tài)代理實現(xiàn)的,而當(dāng)調(diào)用類內(nèi)部的方法時,不是通過代理對象完成的,而是通過 this 對象實現(xiàn)的,這樣就繞過了代理對象,從而事務(wù)就失效了。

此時我們的解決方案是給調(diào)用的方法上也加上 @Transactional,具體實現(xiàn)代碼如下:

4.檢查異常的事務(wù)解決方案

所謂的檢查異常(Checked Excetion)指的是編譯器要求開發(fā)者必須處理的異常,如下圖所示:

檢查異常不回滾事務(wù)的原因是因為,@Transactional 默認(rèn)只回滾運(yùn)行時異常 RuntimeException 和 Error,而對于檢查異常默認(rèn)是不回滾的。

此問題的解決方案是給 @Transactional 注解上,添加 rollbackFor 參數(shù)并設(shè)置 Exception.class 值即可,具體實現(xiàn)代碼如下:

5.數(shù)據(jù)庫不支持事務(wù)的解決方案

當(dāng)我們在程序中添加了 @Transactional,相當(dāng)于給調(diào)用的數(shù)據(jù)庫發(fā)送了:開始事務(wù)、提交事務(wù)、回滾事務(wù)的指令,但是如果數(shù)據(jù)庫本身不支持事務(wù),比如 MySQL 中設(shè)置了使用 MyISAM 引擎,因為它本身是不支持事務(wù)的,這種情況下,即使在程序中添加了 @Transactional 注解,那么依然不會有事務(wù)的行為,也就不會執(zhí)行事務(wù)的自動回滾了。

在這種情況下,我們只需要設(shè)置 MySQL 的引擎為 InnoDB 就可以解決問題了,因為 InnoDB 是支持事務(wù)的,當(dāng)然 MySQL 5.1 之后的默認(rèn)引擎就是 InnoDB,引擎的設(shè)置分為以下兩種情況:

在新建表時設(shè)置數(shù)據(jù)庫引擎:

在修改表時設(shè)置數(shù)據(jù)庫引擎

PS:也就是數(shù)據(jù)庫的引擎是和表直接相關(guān)的,我們只需要正確的設(shè)置引擎之后,事務(wù)就可以正常的執(zhí)行了。

總結(jié)

本文我們介紹了 5 種事務(wù)不自動回滾的場景和相應(yīng)的解決方案,開發(fā)者應(yīng)該根據(jù)自己的實際情況,選擇合適自己解決方案進(jìn)行處理。

到此這篇關(guān)于SpringBoot事務(wù)不回滾的解決方案的文章就介紹到這了,更多相關(guān)SpringBoot事務(wù)不回滾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java設(shè)計模式之備忘錄模式詳解

    Java設(shè)計模式之備忘錄模式詳解

    這篇文章主要介紹了Java設(shè)計模式之備忘錄模式詳解,備忘錄模式在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài)并在該對象之外保存這個狀態(tài),這樣以后就可以將該對象恢復(fù)到原先保存的狀態(tài),需要的朋友可以參考下
    2023-12-12
  • SpringDataElasticsearch與SpEL表達(dá)式實現(xiàn)ES動態(tài)索引

    SpringDataElasticsearch與SpEL表達(dá)式實現(xiàn)ES動態(tài)索引

    這篇文章主要介紹了SpringDataElasticsearch與SpEL表達(dá)式實現(xiàn)ES動態(tài)索引,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • spring如何通過FactoryBean配置Bean

    spring如何通過FactoryBean配置Bean

    這篇文章主要介紹了spring如何通過FactoryBean配置Bean,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • php上傳文件分類實例代碼

    php上傳文件分類實例代碼

    這篇文章主要介紹了php上傳文件分類實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • 詳解java中動態(tài)代理實現(xiàn)機(jī)制

    詳解java中動態(tài)代理實現(xiàn)機(jī)制

    這篇文章主要為大家介紹了java中動態(tài)代理實現(xiàn)機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Java設(shè)計模式之淺談模板方法模式

    Java設(shè)計模式之淺談模板方法模式

    今天給大家?guī)淼氖顷P(guān)于Java設(shè)計模式的相關(guān)知識,文章圍繞著Java模板方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 解決springboot application.yml變灰色的問題

    解決springboot application.yml變灰色的問題

    這篇文章主要介紹了解決springboot application.yml變灰色的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java圖文并茂詳解NIO與零拷貝

    Java圖文并茂詳解NIO與零拷貝

    零拷貝是網(wǎng)絡(luò)編程的關(guān)鍵,很多性能優(yōu)化都離不開。在?Java?程序中,常用的零拷貝有?mmap(memory?map,內(nèi)存映射)?和?sendFile。那么它們在?OS(操作系統(tǒng))?中,到底是怎么樣的一個的設(shè)計?另外我們看下NIO?中如何使用零拷貝
    2022-11-11
  • 基于SpringMVC入門案例及講解

    基于SpringMVC入門案例及講解

    這篇文章主要介紹了基于SpringMVC入門案例及講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 普通java項目集成kafka方式

    普通java項目集成kafka方式

    文章介紹了如何在非Spring Cloud或Spring Boot項目中配置和使用Kafka,提供了一個簡單的Kafka配置讀取類,可以靈活地從不同配置中讀取屬性,并提供默認(rèn)值
    2024-11-11

最新評論

萨嘎县| 长宁县| 蓝山县| 久治县| 鄯善县| 宁明县| 广灵县| 临颍县| 都匀市| 怀集县| 息烽县| 泊头市| 天台县| 讷河市| 邹城市| 刚察县| 尼勒克县| 惠来县| 美姑县| 临泽县| 石家庄市| 桦甸市| 洪洞县| 翁牛特旗| 老河口市| 泸溪县| 红安县| 浦城县| 阜城县| 竹北市| 仪陇县| 遂昌县| 油尖旺区| 息烽县| 日照市| 灵寿县| 甘肃省| 曲靖市| 南岸区| 桂平市| 温州市|