Spring : 事務管理

在這里插入圖片描述

1. 基本概念

事務(Transaction)是一組不可分割的操作單元,這些操作要么全部成功執行,要么全部失敗回滾,不存在部分成功的情況。
事務具有ACID特性:

  • 原子性(Atomicity):事務是不可分割的最小單元。
  • 一致性(Consistency):事務執行前后,數據狀態保持合法(如轉賬后總金額不變)。
  • 隔離性(Isolation):多個事務并發執行時,彼此互不干擾。
  • 持久性(Durability):事務提交后,數據變更永久保存。

2.核心接口

Spring通過抽象層封裝了不同的事務管理方式(如JDBC、Hibernate、MyBatis等),核心接口包括:

接口作用
PlatformTransactionManager事務管理器接口,定義了事務的提交、回滾等操作。
TransactionDefinition定義事務屬性(隔離級別、傳播行為、超時時間等)。
TransactionStatus表示事務的當前狀態(是否活躍、是否已提交等)。

常見實現類

  • DataSourceTransactionManager:用于JDBC或MyBatis的事務管理。
  • HibernateTransactionManager:用于Hibernate的事務管理。

3. 方式

聲明式事務管理

通過注解或XML配置聲明事務規則,無需手動編寫事務控制代碼,侵入性低,是實際開發的首選。

核心注解:@Transactional
可標注在類或方法上,用于聲明該類/方法需要事務管理。

示例:

@Service
public class UserService {// 聲明式事務:方法執行時自動開啟事務@Transactionalpublic void transferMoney() {// 業務邏輯:扣減A的余額,增加B的余額updateUserA();updateUserB();// 若方法正常結束,自動提交事務;若拋出異常,自動回滾}
}

4. @Transactional注解的核心屬性

@Transactional提供了豐富的屬性來配置事務行為:

屬性作用可選值示例
propagation事務傳播行為(解決嵌套事務問題)REQUIRED(默認)、REQUIRES_NEW
isolation事務隔離級別(解決并發問題)READ_COMMITTED(默認)、SERIALIZABLE
readOnly是否為只讀事務(查詢操作可優化性能)true/false(默認false)
timeout事務超時時間(秒),超時自動回滾30(30秒)
rollbackFor指定觸發回滾的異常類型Exception.class
noRollbackFor指定不觸發回滾的異常類型BusinessException.class

關鍵屬性詳解

  1. 事務傳播行為(propagation
    定義了多個事務方法嵌套調用時,事務如何傳播。常見場景:

    • REQUIRED(默認):如果當前有事務,則加入;否則新建事務。
    • REQUIRES_NEW:無論當前是否有事務,都新建一個事務(原事務暫停)。
    • SUPPORTS:如果當前有事務,則加入;否則以非事務方式執行。

    示例:

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logOperation() {// 日志記錄,獨立事務,即使主事務回滾也會提交
    }
    
  2. 事務隔離級別(isolation
    解決并發事務引發的問題(臟讀、不可重復讀、幻讀):

    • READ_UNCOMMITTED:最低級別,允許讀取未提交的數據(可能臟讀)。
    • READ_COMMITTED(默認):只能讀取已提交的數據(避免臟讀)。
    • REPEATABLE_READ:保證多次讀取同一數據結果一致(避免不可重復讀)。
    • SERIALIZABLE:最高級別,完全串行化執行(避免所有并發問題,但性能低)。

5. 事務回滾規則

  • 默認情況下,@Transactional僅對未檢查異常(RuntimeException及其子類) 觸發回滾,對已檢查異常(如IOException 不回滾。
  • 可通過rollbackFor = Exception.class指定對所有異常回滾:
    @Transactional(rollbackFor = Exception.class)
    public void transferMoney() throws Exception {// 任何異常都會觸發回滾
    }
    

6.實現原理

Spring聲明式事務基于AOP(面向切面編程) 實現:

  1. 當方法標注@Transactional時,Spring通過AOP動態生成代理對象。
  2. 代理對象在方法執行前開啟事務,執行后根據是否異常決定提交或回滾。
  3. 事務管理邏輯與業務邏輯解耦,通過"環繞通知"織入。

7. 常見問題與注意事項

  1. @Transactional失效場景

    • 方法被privatefinal修飾(AOP無法生成代理)。
    • 同類中非事務方法調用事務方法(未經過代理對象)。
    • 異常被try-catch捕獲但未重新拋出(Spring無法感知異常)。
    • 數據庫引擎不支持事務(如MySQL的MyISAM,需改用InnoDB)。
  2. 自調用問題
    同類中方法A調用方法B(標注@Transactional),事務會失效,因為未通過代理對象調用。
    解決:注入自身Bean或使用AopContext.currentProxy()獲取代理對象。

  3. 性能優化

    • 查詢操作設置readOnly = true(數據庫可優化)。
    • 避免事務范圍過大(如將非數據庫操作移出事務)。

總結

Spring事務管理簡化了傳統JDBC事務的復雜性,聲明式事務(@Transactional)因其低侵入性成為主流選擇。實際開發中需注意事務的傳播行為、隔離級別及失效場景,確保數據一致性的同時兼顧性能。

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

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

相關文章

C# 一個投資跟蹤程序的設計與實現:面向對象與設計模式的深度解析

在現代金融應用開發中,如何高效、靈活地構建投資跟蹤系統,是每一個金融軟件工程師必須面對的挑戰。本文將圍繞一個投資跟蹤程序的設計與實現過程,深入剖析其背后的設計理念、架構模式以及具體實現細節。我們將通過面向對象編程、設計模式&…

存儲的未來之戰:RustFS如何用ZK框架重構分布式協調?

本篇文章目錄 一、導火索:當數據洪峰撞上分布式協調的天花板 二、技術密碼:ZK框架的三大重構 2.1 一致性哈希環的量子級進化 2.2 動態負載均衡的"神經反射" 2.3 跨云數據同步的"時空折疊" 三、未來戰爭:2026年存儲…

模擬實現STL中的list容器

list前言一、list的節點結構設計二、迭代器設計三、list類的實現3.1 類的成員變量和類型定義3.2 構造函數與析構函數3.3 元素訪問與迭代器接口3.4 插入與刪除操作3.5 其他常用操作四、總結每文推薦前言 在C STL中,list是一個非常常用的容器,它基于雙向循…

Debug-039-el-date-picker組件手動輸入時間日期的問題處理

圖1-外輸入框圖2-內輸入框圖3問題描述:這兩天在迭代功能的時候,基本上碰到的問題都是出自這個“時間日期選擇框”,昨天的bug38也是解決這個組件。如上圖1和2所示,可以把圖1中的輸入框叫外輸入框,圖2中的輸入框叫內輸入…

docker-runc not installed on system

問題 Docker build時Dockerfile有RUN命令執行報錯shim error: docker-runc not installed on system,如下:解決方法 修改/etc/docker/daemon.json,添加正面內容 {"runtimes": {"docker-runc": {"path": "…

【秋招筆試】2025.08.27華為秋招研發崗真題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 題目一:智能溫控系統監測 1??:使用滑動窗口技術維護有效溫度區間 2??:利用單調隊列高效維護窗口內的最大值和最小值 3??:動態調整窗口邊界,確保滿足溫…

Kafka 消費模型

文章目錄1. 一個消費者組中只有 1 個消費者2. 一個消費者組中有 2 個消費者3. 消費者數量 > 分區數量4. 多個消費者讀取同一個分區5. 消費者放入消費者組5.1 何時放入同一個消費者組5.2 何時放入不同的消費者組1. 一個消費者組中只有 1 個消費者 假設我們有一個 TopicT1&am…

【路由器】TP Link 路由器為何無法進入管理后臺

TL-WR710N是TP Link在很多年前發布的一個迷你型的便攜路由器,一插上還能用,直接reset打算重設密碼,結果根據它給的192.168.1.253根本打不開。# 解決方法ping一下192.168.1.253,無法連接。這個問題本質上是 你電腦/手機的 IP 和路由…

LightGBM(Light Gradient Boosting Machine,輕量級梯度提升機)梳理總結

LGB微軟團隊在 2017 年提出的梯度提升樹模型,核心定位是 “更高效的 XGBoost”—— 它在保持精度接近 XGBoost 的同時,通過“數據采樣優化”“特征壓縮”“樹生長策略改進”三大創新,將訓練速度提升 10-100 倍,內存消耗降低數倍&a…

畢業項目推薦:29-基于yolov8/yolov5/yolo11的光伏板檢測識別系統(Python+卷積神經網絡)

文章目錄 項目介紹大全(可點擊查看,不定時更新中)概要一、整體資源介紹技術要點功能展示:功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出(xls格式…

【實時Linux實戰系列】實時數據可視化技術實現

在當今數據驅動的世界中,實時數據可視化已成為理解和利用實時信息的關鍵工具。無論是在金融交易監控、工業生產監控、智能交通管理還是物聯網設備監控中,能夠將復雜的數據以直觀的圖表形式展示出來,對于快速決策和問題解決至關重要。實時數據…

【LeetCode每日一題】21. 合并兩個有序鏈表 2. 兩數相加

每日一題21. 合并兩個有序鏈表題目總體思路算法步驟時間復雜度與空間復雜度代碼2. 兩數相加題目總體思路算法步驟時間復雜度與空間復雜度代碼知識感悟2025.8.3021. 合并兩個有序鏈表 題目 將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所…

DVWA靶場通關筆記-文件包含(Impossible級別)

目錄 一、源碼分析 二、文件包含防范分析 1、明確指定允許包含的文件 2、拒絕所有未在白名單中的輸入 3、總結 (1)白名單 (Allow List) (2)硬編碼/映射 (Hardcoding/Mapping) (3)輸入過濾 (Input F…

構建堅不可摧的數據堡壘:深入解析 Oracle 高可用與容災技術體系

在當今數字化時代,數據是企業的核心資產,而承載這些數據的數據庫系統的連續性與穩定性直接關系到企業的生死存亡。一次計劃外的停機或災難性的數據丟失,帶來的不僅是經濟上的巨大損失,更是對品牌信譽和客戶信任的致命打擊。因此&a…

【3D算法技術入門】如何基于建筑圖片重建三維數字資產?

要基于建筑圖片重建三維數字資產是一個復雜的計算機視覺任務,涉及圖像采集、特征提取、相機姿態估計、稠密重建和三維模型優化等多個步驟。下面我將提供一個基于Python的解決方案框架,使用開源庫實現從圖片到三維模型的基本流程。 首先需要安裝必要的庫&…

?CVPR2025 自動駕駛半監督 LiDAR 分割新范式:HiLoTs 框架深度解析

📄論文題目:HiLoTs: High-Low Temporal Sensitive Representation Learning for Semi-Supervised LiDAR Segmentation in Autonomous Driving ??作者及機構: R.D. Lin、Pengcheng Weng、Yinqiao Wang、Fei Wang(西安交通大學軟件…

【 MYSQL | 基礎篇 函數與約束 】

摘要:本文介紹數據庫中的函數與約束,函數含字符串、數值、日期、流程四類,可實現字符串處理、數值計算等需求。約束分六類,重點講外鍵約束的語法、刪除更新行為,保證數據正確完整。思維導圖1. 函數函數是指一段可以直接…

Oracle 數據庫性能調優:從瓶頸診斷到精準優化之道

引言:性能優化的本質在當今數據驅動的時代,數據庫性能直接關系到企業的運營效率和用戶體驗。Oracle 作為全球領先的關系型數據庫管理系統,承載著眾多企業的核心業務。然而,隨著數據量的增長和業務復雜度的提升,數據庫性…

楊校老師競賽課堂之C++語言GESP一級筆記

考試大綱 GESP一級考試大綱 計算機基礎與編程環境 計算機歷史 變量的定義與使用 基本數據類型(整型、浮點型、字符型、布爾型) 輸入與輸出(cin與cout、scanf與printf) 基本運算(算術運算、關系運算、邏輯運算&am…

操作系統-管程

1. 為什么需要管程?—— 信號量 (Semaphore) 的困境在理解管程之前,你必須先知道它要解決什么問題。之前,我們使用信號量 (Semaphore) 來實現進程/線程間的同步與互斥。雖然信號量功能強大,但它存在兩個主要問題:編程復…