04-深入解析 Spring 事務管理原理及源碼

深入解析 Spring 事務管理原理及源碼

Spring 事務管理(Transaction Management)是企業級應用開發中至關重要的功能之一,它確保數據操作的 原子性、一致性、隔離性、持久性(ACID)

本篇博客將從 Spring 事務的基本概念 開始,深入 Spring 事務的實現機制,并對 @Transactional 注解的底層執行流程 進行源碼級解析。


1. 事務的基本概念

在數據庫操作中,事務是一個邏輯操作單元,必須滿足 ACID 四大特性:

特性說明
原子性(Atomicity)事務內的所有操作要么全部成功,要么全部失敗
一致性(Consistency)事務執行后,數據庫從一個一致性狀態轉換到另一個一致性狀態
隔離性(Isolation)并發事務相互隔離,防止數據不一致
持久性(Durability)事務提交后,數據永久保存到數據庫

?? 2. Spring 事務的核心組件

Spring 通過 聲明式事務編程式事務 來管理數據庫事務。

2.1 Spring 事務的核心接口

組件作用
PlatformTransactionManager事務管理器接口
DataSourceTransactionManager適用于 JDBC 的事務管理器
JpaTransactionManager適用于 JPA(Hibernate)的事務管理器
TransactionDefinition事務的定義,包括隔離級別、傳播行為等
TransactionStatus事務的當前狀態

3. @Transactional 注解解析

Spring 通過 @Transactional 注解實現 聲明式事務,常見用法如下:

@Service
public class OrderService {@Transactionalpublic void createOrder() {// 事務開始orderDao.insertOrder();paymentDao.processPayment(); // 若失敗,事務回滾// 事務提交}
}

3.1 @Transactional 支持的屬性

屬性說明
propagation事務傳播行為
isolation事務隔離級別
timeout事務超時時間
readOnly是否為只讀事務
rollbackFor指定哪些異常會觸發回滾

4. Spring 事務管理的源碼解析

Spring 事務管理的核心是通過 AOP(面向切面編程) 來實現的,底層依賴于 TransactionInterceptor 和 PlatformTransactionManager 來實現事務的創建、提交、回滾等操作。

4.1 事務的創建與提交流程

1?? @Transactional 代理攔截
Spring 事務使用 AOP 代理 來攔截標注了 @Transactional 注解的方法,并通過 TransactionInterceptor 來處理事務的啟動、提交和回滾。具體如下:


public Object invoke(MethodInvocation invocation) throws Throwable {return transactionInterceptor.invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);
}

2?? 獲取事務管理器并創建事務
事務管理器(如 DataSourceTransactionManager)負責管理事務。在 doBegin() 方法中會啟動一個新的事務:


@Override
protected void doBegin(Object transaction, TransactionDefinition definition) {Connection conn = DataSourceUtils.getConnection(dataSource);conn.setAutoCommit(false); // 關閉自動提交,開啟事務
}

3?? 執行業務邏輯
當事務開始后,Spring 會執行業務方法(invocation.proceed())。如果在業務邏輯執行過程中出現異常,則會觸發回滾。

4?? 提交或回滾事務
當方法執行完成后,事務會根據是否拋出異常來決定提交還是回滾:

@Override
protected void doCommit(DefaultTransactionStatus status) {status.getConnectionHolder().getConnection().commit();
}@Override
protected void doRollback(DefaultTransactionStatus status) {status.getConnectionHolder().getConnection().rollback();
}

5. 事務的傳播機制

Spring 事務支持 7 種傳播行為,用于控制當前事務如何傳播到嵌套事務中。以下是最常用的幾種傳播行為及其實際應用:

傳播行為實例
1?? REQUIRED(默認行為
如果當前存在事務,則加入事務;如果當前沒有事務,則新建事務。例如:


@Transactional(propagation = Propagation.REQUIRED)
public void method1() {// 當前存在事務,將加入該事務
}

如果 method1() 中調用了一個沒有聲明事務的方法 method2(),method2() 會加入到 method1() 的事務中。

2?? REQUIRES_NEW
當前方法總是會新建一個事務,暫停當前事務。例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method1() {// 新建一個事務,當前事務會被掛起
}

當 method1() 執行時,它會暫停外部事務,并在自身內部創建一個新的事務。

3?? NESTED
在當前事務中創建一個嵌套事務。嵌套事務可以獨立提交或回滾,但會共享外部事務的連接。例如:


@Transactional(propagation = Propagation.NESTED)
public void method1() {// 創建一個嵌套事務
}

嵌套事務在提交時不會影響外部事務,但可以獨立回滾。

組合后的效果
REQUIRED + REQUIRES_NEW:會在外部事務的基礎上創建新的事務,外部事務掛起,內部事務完成后恢復外部事務。

REQUIRED + NESTED:如果外部事務提交,嵌套事務也會提交;若外部事務回滾,嵌套事務也會回滾。

通過以上,應該可以很快了解Spring事務,也能更快的去排查跟定位問題。
如果你還有其他問題或想了解更多,歡迎留言交流! 😊

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

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

相關文章

【Linux】用戶向硬件寄存器寫入值過程理解

思考一下,當我們咋用戶態向寄存器寫入一個值,這個過程是怎么樣的呢?以下是應用程序通過標準庫函數(如 write()、ioctl() 或 mmap())向硬件寄存器寫入值的詳細過程,從用戶空間到內核再到硬件的完整流程&…

自動駕駛02:點云預處理——02(運動補償篇LIO-SAM)

當激光雷達(LiDAR)在運動中采集點云時,每個點的時間戳不同,而車輛在移動,導致點云在不同時間點的坐標與實際情況不符,這種現象稱為運動畸變(Motion Distortion)。為了得到無畸變的點…

基礎算法篇(3)(藍橋杯常考點)—圖論

前言 這期是基礎算法篇的第三節,其中的dijkstra算法更是藍橋杯中的高頻考點 圖的基本相關概念 有向圖和無向圖 自環和重邊 稠密圖和稀疏圖 對于不帶權的圖,一條路徑的路徑長度是指該路徑上各邊權值的總和 對于帶權的圖,一條路徑長度時指該路…

Crawl4AI:專為AI設計的開源網頁爬蟲工具,釋放大語言模型的潛能

在當今數據驅動的AI時代,高效獲取結構化網頁數據是模型訓練和應用落地的關鍵。Crawl4AI作為一款專為大型語言模型(LLMs)設計的開源爬蟲工具,憑借其極速性能、AI友好輸出和模塊化設計,正在成為開發者社區的熱門選擇。本文將深入解析其核心特性與技術優勢。 一、Crawl4AI的核…

前后端數據序列化:從數組到字符串的旅程(附優化指南)

🌐 前后端數據序列化:從數組到字符串的旅程(附優化指南) 📜 背景:為何需要序列化? 在前后端分離架構中,復雜數據類型(如數組、對象)的傳輸常需序列化為字符…

匯編學習之《移位指令》

這章節學習前需要回顧之前的標志寄存器的內容: 匯編學習之《標志寄存器》 算數移位指令 SAL (Shift Arithmetic Left)算數移位指令 : 左移一次,最低位用0補位,最高位放入EFL標志寄存器的CF位(進位標志) OllyDbg查看…

NLP高頻面試題(二十九)——大模型解碼常見參數解析

在大語言模型的實際應用中,如何更有效地控制文本生成的質量與多樣性,一直是熱門研究話題。其中,模型解碼(decode)策略至關重要,涉及的主要參數包括 top_k、top_p 和 temperature 等。本文將詳細介紹這些常見…

【C#】Task 線程停止

CancellationTokenSource cts 是用于控制任務(線程)停止運行的。我們一步步來解釋它的作用。 🔍 現在的代碼結構大概是這樣的: Task.Run(() > {while (true){// 不斷循環采集圖像} });這種寫法雖然簡單,但最大的問…

WebRTC的ICE之TURN協議的交互流程中繼轉發Relay媒體數據的turnserver的測試

WebRTC的ICE之TURN協議的交互流程和中繼轉發Relay媒體數據的turnserver的測試 WebRTC的ICE之TURN協議的交互流程中繼轉發Relay媒體數據的turnserver的測試 WebRTC的ICE之TURN協議的交互流程和中繼轉發Relay媒體數據的turnserver的測試前言一、TURN協議1、連接Turn Server 流程①…

Redis + Caffeine多級緩存電商場景深度解析

Redis Caffeine多級緩存 Redis Caffeine多級緩存電商場景深度解析一、實施目的二、具體實施2.1 架構設計2.2 組件配置2.3 核心代碼實現 三、實施效果3.1 性能指標對比3.2 業務指標改善3.3 系統穩定性 四、關鍵策略4.1 緩存預熱4.2 一致性保障4.3 監控配置Prometheus監控指標 …

前端開發3D-基于three.js

基于 three.js 渲染任何畫面,都要基于這 3 個要素來實現 1場景scene:放置物體的容器 2攝像機:類似人眼,可調整位置,角度等信息,展示不同畫面 3渲染器:接收場景和攝像機對象,計算在瀏…

代碼隨想錄算法訓練營--打卡day4

一.移除鏈表元素 1.題目鏈接 203. 移除鏈表元素 - 力扣(LeetCode) 2.思路 通過 while 循環來遍歷鏈表,只要 cur 的下一個節點不為空,就繼續循環。在循環中,對 cur 的下一個節點的值進行判斷: 值不等于…

虛擬電廠:多元能源聚合,開啟綠色電力新時代

虛擬電廠:多元能源聚合,開啟綠色電力新時代 在“雙碳”目標驅動下,電力系統正經歷從集中式向分布式、從單一能源向多能互補的深刻變革。 作為能源互聯網的核心載體,虛擬電廠通過數字化技術整合多種能源資源,而是像指…

高通Android10 鈴聲通話音頻80%音量修改

先修改最高的音量step --- a/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.javab/SC60_AP/frameworks/base/services/core/java/com/android/server/audio/AudioService.java-311,14 311,14 public class AudioService extends IAudio…

類加載過程?類隔離了解過嗎?

類加載過程詳解 類加載是 JVM 將類的字節碼從磁盤、網絡或其他來源加載到內存,并轉換為 Class 對象的過程,主要分為以下 五個階段: 1. 加載(Loading) 任務:查找類的二進制字節流(如 .class 文…

使用msmtp和mutt在CentOS上發送指定目錄下的所有文件作為郵件附件

1.安裝 msmtp: 如果尚未安裝,請先通過以下命令安裝msmtp。 sudo yum install msmtp 2.配置 msmtp 使用新浪郵箱: 創建或編輯配置文件~/.msmtprc,輸入以下內容(記得替換授權碼)。 defaults tls on tls_st…

Vue+Elementui首頁看板

源碼 <template><!-- 查詢條件--><div class="optimize-norm" v-loading="selectDataLoading"><el-form :model="queryParams" ref="queryRef" style="padding-bottom:8px" :inline="true"…

匯編學習之《指針寄存器大小端學習》

什么是指針寄存器&#xff1f; 操作棧的寄存器 棧&#xff1a; 保存函數里面傳遞的參數&#xff0c;局部變量等。 EBP&#xff1a; 指向棧底的指針 ESP&#xff1a; 指向棧頂的指針。 計算入棧地址變化規則 通過OllDbg查看 有可能點擊安裝的時候棧區域第一次查看會沒有顯…

Oracle數據庫數據編程SQL<3.7 PL/SQL 觸發器(Trigger)>

觸發器是Oracle數據庫中的一種特殊存儲過程&#xff0c;它會在特定數據庫事件發生時自動執行。觸發器通常用于實現復雜的業務規則、數據驗證、審計跟蹤等功能。 目錄 一、觸發器基本概念 1. 觸發器特點 2. 觸發器組成要素 二、觸發器類型 1. DML觸發器 2. DDL觸發器 3.…

2025年滲透測試面試題總結-某 攜程旅游-基礎安全工程師(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 攜程旅游-基礎安全工程師 反序列化原理 核心原理 擴展分析 SQL注入本質 核心原理 擴展分析 SQL注…