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

Java事務回滾詳解以及常見誤區(qū)

 更新時間:2025年09月10日 08:27:03   作者:軒轅龍兒  
事務是指是程序中一系列嚴密的邏輯操作,而且所有操作必須全部成功完成,否則在每個操作中所作的所有更改都會被撤消,這篇文章主要介紹了Java事務回滾詳解以及常見誤區(qū)的相關資料,需要的朋友可以參考下

一、什么是事務回滾?

事務回滾指的是:當執(zhí)行過程中發(fā)生異常時,之前對數(shù)據(jù)庫所做的更改全部撤銷,數(shù)據(jù)庫狀態(tài)恢復到事務開始前的狀態(tài)。這是數(shù)據(jù)庫“原子性”原則的體現(xiàn)。

二、Spring 中的@Transactional默認行為

在 Spring 中,使用注解方式開啟事務非常簡單:

@Transactional
public void doSomething() {
    // 執(zhí)行數(shù)據(jù)庫操作
}

此時的默認行為是:

  • 事務會在方法成功執(zhí)行后提交;
  • 遇到 RuntimeException 或 Error,會自動回滾;
  • 遇到 Checked Exception(即編譯時異常),不會自動回滾。

例如:

@Transactional
public void test1() {
    throw new RuntimeException(); // ? 會回滾
}

@Transactional
public void test2() throws Exception {
    throw new Exception(); // ? 不會回滾
}

三、使用rollbackFor讓事務回滾受檢異常

如果你希望事務在任何異常發(fā)生時都回滾,包括受檢異常,比如 IOException、SQLException,就需要顯式指定:

@Transactional(rollbackFor = Exception.class)
public void test3() throws Exception {
    throw new Exception(); // ? 會回滾
}
  • rollbackFor 的值可以是一個或多個異常類;
  • 你可以根據(jù)需要選擇只對某些異常類型回滾,其他的則不回滾。

四、rollbackFor和rollbackOn的區(qū)別

特性rollbackForrollbackOn
適用范圍SpringJava EE / JTA
包名org.springframework.transaction.annotation.Transactionaljavax.transaction.Transactional
默認行為回滾RuntimeException不回滾任何異常
明確配置后可回滾任何指定異常可回滾任何指定異常

示例比較:

Spring 中的寫法:

import org.springframework.transaction.annotation.Transactional;

@Transactional(rollbackFor = Exception.class)
public void springTransaction() throws Exception {
    throw new Exception("測試受檢異常");
}

JTA(Java EE)中的寫法:

import javax.transaction.Transactional;

@Transactional(rollbackOn = Exception.class)
public void jtaTransaction() throws Exception {
    throw new Exception("測試受檢異常");
}

注意:使用的是不同的注解類,不能混用!

五、常見誤區(qū)

? 誤區(qū)1:以為所有異常都會觸發(fā)事務回滾

Spring 默認只回滾 RuntimeException,不會回滾 Exception(受檢異常)。這是導致事務未回滾的最常見原因。

? 誤區(qū)2:以為@Transactional可以應用于任何方法

只有被 Spring 容器管理(即被 Spring 掃描并代理)的類中的 public 方法,@Transactional 才有效。如果你在 private 方法上加了注解,是不會生效的。

? 誤區(qū)3:使用錯誤的注解類

Spring 和 JTA 的 @Transactional 注解來自不同的包,使用時務必導入正確:

  • Spring: org.springframework.transaction.annotation.Transactional
  • JTA: javax.transaction.Transactional

六、小結(jié)

常見問題與解決方式

問題默認行為解決方式
事務不回滾受檢異常? 不回滾? 添加rollbackFor = Exception.class(Spring)或 rollbackOn = Exception.class(JTA)
事務注解不生效? 方法不是public,類未被 Spring 管理? 保證類被 Spring 掃描,方法為public
導入錯誤注解? 使用了錯誤的@Transactional 注解? 使用正確包名下的注解(見下表)

Spring 與 JTA 的@Transactional對比

特性SpringJTA(Java EE)
注解類全名org.springframework.transaction.annotation.Transactionaljavax.transaction.Transactional
默認回滾行為回滾RuntimeException,不回滾 Exception不回滾任何異常
控制參數(shù)rollbackFor, noRollbackForrollbackOn, dontRollbackOn
常見場景Spring Boot, Spring MVC 項目Java EE, Jakarta EE 應用服務器項目
建議用法用 Spring 的事務注解為主僅在 Java EE 項目中使用

七、結(jié)語

事務控制是保障系統(tǒng)數(shù)據(jù)一致性的重要手段,理解事務的回滾機制尤為重要。在實際開發(fā)中,推薦明確指定異?;貪L策略,避免因受檢異常不回滾而造成數(shù)據(jù)異常。

希望這篇文章能幫你在開發(fā)中更精準地使用 @Transactional,寫出更健壯、可控的代碼。

附:下面說說我經(jīng)常見到的3種事務不回滾的產(chǎn)生原因:

(1)聲明式事務配置切入點表達式寫錯了,沒切中Service中的方法

(2)Service方法中,把異常給try catch了,但catch里面只是打印了異常信息,沒有手動拋出RuntimeException異常

(3)Service方法中,拋出的異常不屬于運行時異常(如IO異常),因為Spring默認情況下是捕獲到運行時異常就回滾

到此這篇關于Java事務回滾詳解以及常見誤區(qū)的文章就介紹到這了,更多相關Java事務回滾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中的工具類命名方法

    Java中的工具類命名方法

    這篇文章主要介紹了Java中的工具類究竟如何命名,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • java8中parallelStream性能測試及結(jié)果分析

    java8中parallelStream性能測試及結(jié)果分析

    本篇文章給大家用代碼實例做了segmentfaultjava8中parallelStream性能測試,并對測試結(jié)果做了說明,需要的朋友學習下吧。
    2018-01-01
  • Hibernate5新特性介紹

    Hibernate5新特性介紹

    hibernate5中有了一些新的變動,下面腳本之家小編把Hibernate5新特性相關知識,分享到腳本之家平臺,感興趣的朋友參考下吧
    2017-09-09
  • mybatis plus自動生成器解析(及遇到的坑)

    mybatis plus自動生成器解析(及遇到的坑)

    這篇文章主要介紹了mybatis-plus自動生成器及遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 教你用springboot連接mysql并實現(xiàn)增刪改查

    教你用springboot連接mysql并實現(xiàn)增刪改查

    今天教各位小伙伴用springboot連接mysql并實現(xiàn)增刪改查功能,文中有非常詳細的步驟及代碼示例,對正在學習Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    SpringBoot讀取resource目錄下文件失敗的原因及解決方案

    在idea中運行時,有些resource下文件讀取工具類能夠正常獲取讀取到文件,但是通過java–jar的方式去運行jar包,此時resource下文件讀取工具類讀取文件就失效了,本文就給大家介紹一下SpringBoot讀取resource目錄下文件失敗解決方案,需要的朋友可以參考下
    2023-08-08
  • Maven插件詳細步驟

    Maven插件詳細步驟

    在學習和了解 Nexus-public 過程中,發(fā)現(xiàn) Java 項目中有一大部分是以 Maven 插件的形式進行深度融合不同功能的,下面給大家介紹Maven插件詳細步驟,感興趣的朋友一起看看吧
    2025-05-05
  • JAVA CountDownLatch與thread-join()的區(qū)別解析

    JAVA CountDownLatch與thread-join()的區(qū)別解析

    這篇文章主要介紹了JAVA CountDownLatch與thread-join()的區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Spring源碼BeanFactoryPostProcessor詳解

    Spring源碼BeanFactoryPostProcessor詳解

    BeanFactoryPostProcessor的執(zhí)行時機是在Spring掃描完成后,Bean初始化前,當我們實現(xiàn)BeanFactoryPostProcessor接口,可以在Bean的初始化之前對Bean進行屬性的修改,下面通過本文看下Spring源碼分析-BeanFactoryPostProcessor的實例代碼,感興趣的朋友一起看看吧
    2021-11-11
  • java并發(fā)編程專題(三)----詳解線程的同步

    java并發(fā)編程專題(三)----詳解線程的同步

    這篇文章主要介紹了JAVA并發(fā)編程 線程同步的的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06

最新評論

漠河县| 方城县| 无极县| 恩施市| 甘南县| 施甸县| 泉州市| 兴海县| 进贤县| 云安县| 海门市| 电白县| 泾川县| 静海县| 抚宁县| 白山市| 扶余县| 巨鹿县| 迭部县| 石城县| 丹阳市| 墨竹工卡县| 洛南县| 崇文区| 礼泉县| 大庆市| 吉首市| 朔州市| 北碚区| 焉耆| 苏尼特右旗| 凤凰县| 寿宁县| 塔城市| 南安市| 苍梧县| 定襄县| 宜丰县| 绵竹市| 乐业县| 咸丰县|