Java事務回滾詳解

一、什么是事務回滾?

事務回滾指的是:當執行過程中發生異常時,之前對數據庫所做的更改全部撤銷,數據庫狀態恢復到事務開始前的狀態。這是數據庫“原子性”原則的體現。


二、Spring 中的 @Transactional 默認行為

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

@Transactional
public void doSomething() {// 執行數據庫操作
}

此時的默認行為是:

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

例如:

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

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

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

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

四、rollbackForrollbackOn 的區別

特性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("測試受檢異常");
}

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


五、常見誤區

? 誤區1:以為所有異常都會觸發事務回滾

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

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

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

? 誤區3:使用錯誤的注解類

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

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

六、小結

常見問題與解決方式

問題默認行為解決方式
事務不回滾受檢異常? 不回滾? 添加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不回滾任何異常
控制參數rollbackFor, noRollbackForrollbackOn, dontRollbackOn
常見場景Spring Boot, Spring MVC 項目Java EE, Jakarta EE 應用服務器項目
建議用法用 Spring 的事務注解為主僅在 Java EE 項目中使用

七、結語

事務控制是保障系統數據一致性的重要手段,理解事務的回滾機制尤為重要。在實際開發中,推薦明確指定異常回滾策略,避免因受檢異常不回滾而造成數據異常。

希望這篇文章能幫你在開發中更精準地使用 @Transactional,寫出更健壯、可控的代碼。如果你有更多問題,歡迎留言討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86521.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云災備數據復制技術研究

云災備數據復制技術:數字時代的“安全氣囊” 在當今信息化時代,數據就像城市的“生命線”,一旦中斷,后果不堪設想。想象一下,如果政務系統突然崩潰,成千上萬的市民服務將陷入癱瘓。這就是云災備技術的重要…

如何處理Shopify主題的顯示問題:實用排查與修復指南

在Shopify店鋪運營過程中,主題顯示問題是影響用戶體驗與品牌形象的常見痛點。可能是字體錯位、圖片無法加載、移動端顯示混亂、功能失效等,這些都可能造成客戶流失和轉化下降。 本文將從問題識別、原因分析、修復方法到開發者建議全方位解讀如何高效解決…

前端監控方案詳解

一、前端監控方案是什么? 前端監控方案是一套系統化的工具和流程,用于收集、分析和報告網站或Web應用在前端運行時的各種性能指標、錯誤日志、用戶行為等數據。它通常包括以下幾個核心模塊: 性能監控:頁面加載時間、資源加載時間…

Camera相機人臉識別系列專題分析之十二:人臉特征檢測FFD算法之libvega_face.so數據結構詳解

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: Camera相機人臉識別系列專題分析之十一:人臉特征檢測FFD算法之低功耗libvega_face.so人臉屬性(年齡,性別,膚…

如何配置HarmonyOS 5與React Native的開發環境?

配置 HarmonyOS 5 與 React Native 的開發環境需遵循以下步驟 一、基礎工具安裝 ?DevEco Studio 5.0? 從 HarmonyOS 開發者官網 下載安裝勾選組件: HarmonyOS SDK (API 12)ArkTS 編譯器JS/ArkTS 調試工具HarmonyOS 本地模擬器 ?Node.js 18.17 # 安裝后驗證版…

kotlin kmp 副作用函數 effect

在 Kotlin Multiplatform (KMP) Compose 中,“effect functions”(或“effect handlers”)是專門的可組合函數,用于在 UI 中管理副作用。 在 Compose 中,可組合函數應該是“純”的和聲明式的。這意味著它們應該理想地…

3.3.1_1 檢錯編碼(奇偶校驗碼)

從這節課開始,我們會探討數據鏈路層的差錯控制功能,差錯控制功能的主要目標是要發現并且解決一個幀內部的位錯誤,我們需要使用特殊的編碼技術去發現幀內部的位錯誤,當我們發現位錯誤之后,通常來說有兩種解決方案。第一…

【Pandas】pandas DataFrame isna

Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值(NaN)DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充(即“下一個有效觀測值”&#xff09…

MQTT協議:物聯網時代的通信基石

MQTT協議:物聯網時代的通信基石 在當今快速發展的物聯網(IoT)時代,設備之間的通信變得尤為重要。MQTT(Message Queuing Telemetry Transport)協議作為一種輕量級的消息傳輸協議,正逐漸成為物聯…

Excel 表格內批量添加前綴與后綴的實用方法

我們經常需要為 Excel 表格中的內容統一添加前綴或后綴,例如給編號加“NO.”、給姓名加“會員_”等。手動操作效率低,本文將介紹幾種實用的方法,幫助你快速完成批量添加前綴和后綴的操作。 使用“&”運算符添加前綴或后綴(推…

uniapp 實現騰訊云IM群文件上傳下載功能

UniApp 集成騰訊云IM實現群文件上傳下載功能全攻略 一、功能背景與技術選型 在團隊協作場景中,群文件共享是核心需求之一。本文將介紹如何基于騰訊云IMCOS,在uniapp中實現: 群內文件上傳/下載文件元數據管理下載進度追蹤跨平臺文件預覽 二…

GO協程(Goroutine)問題總結

在使用Go語言來編寫代碼時,遇到的一些問題總結一下 [參考文檔]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函數默認的Goroutine 場景再現: 今天在看到這個教程的時候,在自己的電…

uniapp微信小程序視頻實時流+pc端預覽方案

方案類型技術實現是否免費優點缺點適用場景延遲范圍開發復雜度?WebSocket圖片幀?定時拍照Base64傳輸? 完全免費無需服務器 純前端實現高延遲高流量 幀率極低個人demo測試 超低頻監控500ms-2s???RTMP推流?TRTC/即構SDK推流? 付費方案 (部分有免費額度&#x…

分布式鎖實戰:Redisson vs. Redis 原生指令的性能對比

分布式鎖實戰:Redisson vs. Redis 原生指令的性能對比 引言 在DIY主題模板系統中,用戶可自定義聊天室的背景、圖標、動畫等元素。當多個運營人員或用戶同時修改同一模板時,若沒有鎖機制,可能出現“甲修改了背景色,乙…

C++ 設計模式《復制粘貼的奇跡:小明的原型工廠》

👨?🎓 模式名稱:原型模式(Prototype Pattern) 📖 背景故事 創業初期,小明每天加班寫配送路線、配送策略、營銷套餐。可當業務做大后,他發現大家常常下單“上次那個套餐”—— “老…

【Elasticsearch】映射:fielddata 詳解

映射:fielddata 詳解 1.fielddata 是什么2.fielddata 的工作原理3.主要用法3.1 啟用 fielddata(通常在 text 字段上)3.2 監控 fielddata 使用情況3.3 清除 fielddata 緩存 4.使用場景示例示例 1:對 text 字段進行聚合示例 2&#…

開源 vGPU 方案:HAMi,實現細粒度 GPU 切分

本文主要分享一個開源的 GPU 虛擬化方案:HAMi,包括如何安裝、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案,HAMi 除了 GPU 共享之外還可以實現 GPU core、memory 得限制,保證共享同一 GPU 的各個 Pod 都能拿到足夠的資源。…

PlayDiffusion上線:AI語音編輯進入“無痕時代”

在語音合成與語音編輯領域,一個長期存在的挑戰是如何在修改語音內容的同時,保持原始語音的自然性、連貫性和說話人特征。近日,一款名為 PlayDiffusion 的新型 AI 語音修復模型應運而生,成功實現了這一目標。 PlayDiffusion 是一個…

2025年能源電力系統與流體力學國際會議 (EPSFD 2025)

2025年能源電力系統與流體力學國際會議(EPSFD 2025)將于本年度在美麗的杭州盛大召開。作為全球能源、電力系統以及流體力學領域的頂級盛會,EPSFD 2025旨在為來自世界各地的科學家、工程師和研究人員提供一個展示最新研究成果、分享實踐經驗及…

微信小程序前端面經

一、技術棧與編碼能力(10min) 1. Vue 3 & Composition API Q1:請解釋一下 ref 和 reactive 的區別?你在項目中是如何使用的? 答:ref是包裝一個原始值或對象,通過.value訪問,r…