Spring 事務管理核心機制與傳播行為應用

Spring 事務詳解


一、Spring 事務簡介

Spring 事務管理基于?AOP(面向切面編程)實現,通過?聲明式事務(注解或 XML 配置)統一管理數據庫操作,確保數據一致性。核心目標:保證多個數據庫操作的原子性(要么全部成功,要么全部回滾)。

核心優勢

  • 解耦業務代碼與事務管理:通過注解配置,無需侵入業務邏輯。

  • 支持多種事務管理器:如 JDBC、Hibernate、JPA 等。

  • 靈活的事務傳播行為:控制事務的邊界和嵌套邏輯。


二、?案例:銀行賬戶轉賬

需求:用戶 A 向用戶 B 轉賬,需保證扣款和存款操作同時成功或失敗。

代碼實現
(1) 業務層接口與實現類
public interface AccountService {void transfer(String fromUser, String toUser, int money);
}@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Transactional  // 開啟事務管理@Overridepublic void transfer(String fromUser, String toUser, int money) {// 扣款accountDao.reduceMoney(fromUser, money);// 模擬異常(事務應回滾)// int i = 1 / 0;  // 存款accountDao.addMoney(toUser, money);}
}
(2) 數據層(DAO)
@Repository
public class AccountDaoImpl implements AccountDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void reduceMoney(String user, int money) {String sql = "UPDATE account SET balance = balance - ? WHERE username = ?";jdbcTemplate.update(sql, money, user);}public void addMoney(String user, int money) {String sql = "UPDATE account SET balance = balance + ? WHERE username = ?";jdbcTemplate.update(sql, money, user);}
}

三、Spring 事務核心配置

步驟 1:啟用事務管理
  • Spring Boot:默認已啟用事務,無需額外配置。

  • 非 Spring Boot:在配置類添加?@EnableTransactionManagement

    @Configuration
    @EnableTransactionManagement  // 開啟注解式事務驅動
    public class AppConfig { ... }
步驟 2:配置事務管理器
  • Spring Boot:自動配置?DataSourceTransactionManager

  • 手動配置

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
    }
步驟 3:使用?@Transactional?注解
  • 作用位置:類(所有方法生效)或方法。

  • 關鍵屬性

    • propagation:事務傳播行為(默認?REQUIRED)。

    • isolation:事務隔離級別(默認?DEFAULT,跟隨數據庫)。

    • rollbackFor:指定觸發回滾的異常類型。

    • timeout:事務超時時間(秒)。


四、Spring 事務角色

角色說明
事務管理器PlatformTransactionManager?接口的實現類(如?DataSourceTransactionManager)。
事務定義通過?@Transactional?注解或 XML 配置定義事務屬性(傳播行為、隔離級別等)。
事務狀態事務的運行時狀態(如是否是新事務、是否回滾)。


五、Spring 事務屬性

屬性說明常用值
propagation事務傳播行為(控制事務邊界)REQUIRED(默認)、REQUIRES_NEWNESTEDSUPPORTS?等。
isolation事務隔離級別(解決并發問題)DEFAULTREAD_COMMITTEDREAD_UNCOMMITTEDREPEATABLE_READ?等。
timeout事務超時時間(秒),超時自動回滾。默認 -1(無超時)。
readOnly是否只讀事務(優化數據庫性能)。true?或?false(默認)。
rollbackFor觸發回滾的異常類型(默認僅回滾?RuntimeException)。如?rollbackFor = Exception.class
noRollbackFor不觸發回滾的異常類型。如?noRollbackFor = NullPointerException.class

六、 事務傳播行為(Propagation)

控制事務方法之間如何相互影響,常見行為:

傳播行為說明
REQUIRED如果當前存在事務,則加入該事務;否則新建一個事務(默認行為)。
REQUIRES_NEW無論當前是否存在事務,都新建一個事務,掛起當前事務(獨立提交)。
SUPPORTS如果當前存在事務,則加入;否則以非事務方式執行。
NESTED如果當前存在事務,則嵌套在子事務中執行(可部分回滾)。


七、案例:轉賬業務追加日志

需求:在轉賬操作后記錄日志,且日志記錄必須成功(即使轉賬失敗也要記錄)。

代碼實現
@Service
public class LogService {@Autowiredprivate LogDao logDao;// 使用 REQUIRES_NEW 傳播行為:獨立事務@Transactional(propagation = Propagation.REQUIRES_NEW)public void addLog(String logInfo) {logDao.insertLog(logInfo);// 即使轉賬失敗,日志也會提交}
}@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Autowiredprivate LogService logService;@Transactional@Overridepublic void transfer(String fromUser, String toUser, int money) {accountDao.reduceMoney(fromUser, money);accountDao.addMoney(toUser, money);// 記錄日志(獨立事務)logService.addLog("轉賬操作:" + fromUser + " 向 " + toUser + " 轉賬 " + money);}
}

關鍵點

  • 日志方法?addLog?使用?REQUIRES_NEW,確保日志事務獨立提交。

  • 即使轉賬事務回滾,日志事務仍會提交。


八、事務配置示例

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,timeout = 30,rollbackFor = {SQLException.class, IOException.class}
)
public void businessMethod() { ... }

九、 常見問題

  1. 事務不生效

    • 檢查是否啟用事務管理(@EnableTransactionManagement)。

    • 確保?@Transactional?注解應用在?public?方法上。

    • 確認異常類型是否觸發回滾(默認僅回滾?RuntimeException?和?Error)。

  2. 事務傳播行為錯誤

    • 嵌套事務中錯誤使用?REQUIRES_NEW?可能導致事務過多,影響性能。


十、總結

  • 核心注解@EnableTransactionManagement(啟用事務)、@Transactional(定義事務屬性)。

  • 事務傳播行為:根據業務需求選擇合適的行為(如?REQUIRED?或?REQUIRES_NEW)。

  • 事務管理本質:基于 AOP 動態代理實現,通過事務管理器控制數據庫連接。

進一步實踐:結合具體業務場景測試不同傳播行為和隔離級別,深入理解事務的邊界控制!

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

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

相關文章

JavaScript解密實戰指南:從基礎到進階技巧

JavaScript加密技術廣泛應用于數據保護、反爬蟲和代碼混淆,但掌握解密方法能幫助開發者突破技術壁壘。本文結合爬蟲實戰與安全分析場景,系統梳理JS解密的核心方法與工具。 一、基礎解密方法 1. Base64解碼 適用于簡單編碼場景,如Cookie加密…

WEMOS LOLIN32

ESP32是結合Wi-Fi和藍牙的32位元系統單晶片(SoC)與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板,最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…

俄羅斯方塊-簡單開發版

一、需求分析 實現了一個經典的俄羅斯方塊小游戲,主要滿足以下需求: 1.圖形界面 使用 pygame 庫創建一個可視化的游戲窗口,展示游戲的各種元素,如游戲區域、方塊、分數等信息。 2.游戲邏輯 實現方塊的生成、移動、旋轉、下落和鎖…

使用安全繼電器的急停電路設計

使用安全繼電器的急停電路設計 一,急停回路的設計1,如何將急停接到線路當中?2,急停開關 如何接到安全繼電器中 一,急停回路的設計 急停是每一個設備必不可少的部分,因為關乎安全,所以說所以說他…

【讀書筆記·VLSI電路設計方法解密】問題64:什么是芯片的功耗分析

低功耗設計是一種針對VLSI芯片功耗持續攀升問題的設計策略。隨著工藝尺寸微縮,單顆芯片可集成更多元件,導致功耗相應增長。更嚴峻的是,現代芯片工作頻率較二十年前大幅提升,而功耗與頻率呈正比關系。因此,芯片功耗突破…

在 Debian 10.x 安裝和配置 Samba

1. 更新系統 sudo apt update sudo apt upgrade -y2. 安裝 Samba sudo apt install samba -y3. 配置 Samba 備份默認配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak編輯配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目錄) …

修改PointLIO項目

添加key_frame_info.msg消息 新建.msg文件,內容填寫為: # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…

關于隔離1

1.隔離的目的: 在隔離電源設計中,輸入與輸出之間沒有直接電氣連接,提供絕緣高阻態,防止電流回路。這意味著輸入與輸出之間呈現為絕緣的高阻態,從而確保了無電流回路的形成。 隔離與可靠保護有關。電隔離是一種電路設…

【java實現+4種變體完整例子】排序算法中【插入排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

以下是插入排序的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格: 一、插入排序基礎實現 原理 將元素逐個插入到已排序序列的合適位置,逐步構建有序序列。 代碼示例 public class InsertionSort {void…

清醒思考的藝術

成為穿越暴風雨后的幸存者 系統性錯誤是指系統性的偏離理性,偏離最理想的、合乎邏輯的、理智的思考和行為。 “系統”一詞很重要,因為我們經常錯誤地走向同一方向。 幸存偏誤 幸存偏誤會扭曲概率,系統性的高估了成功概率。一旦混淆選擇標準和…

DSA數據結構與算法 6

查找技術(Searching Techniques) 查找簡介 在計算機科學中,“查找”指的是在某個集合或序列中尋找特定元素的過程。這個過程可以是成功的,也可以是失敗的: 若目標元素存在于集合中,我們稱之為“查找成功”…

FastAPI:現代高性能Python Web框架的技術解析與實踐指南

一、FastAPI的誕生背景與技術定位 在數字化轉型的浪潮中,API(應用程序接口)作為連接服務與數據的核心樞紐,其性能與開發效率直接影響業務迭代速度。傳統Python框架如Django和Flask雖功能豐富,但在高并發場景下面臨性能瓶頸,且缺乏對異步編程的原生支持。FastAPI應運而生…

VuePress 使用教程:從入門到精通

VuePress 使用教程:從入門到精通 VuePress 是一個以 Vue 驅動的靜態網站生成器,它為技術文檔和技術博客的編寫提供了優雅而高效的解決方案。無論你是個人開發者、團隊負責人還是開源項目維護者,VuePress 都能幫助你輕松地創建和管理你的文檔…

1.Vue自動化工具安裝(Vue-cli)

目錄 1.node.js 安裝: 2 npm 安裝 3 安裝Vue-cli 4總結: 一般情況下,單文件組件,我們運行在 自動化工具vue-CLI中,可以幫我們編譯單文件組件。所以我們在學習時一般需要在系統中先搭建vue-CLI工具 下面就是一些我…

IP數據報

IP數據報組成 IP數據報(IP Datagram)是網絡中傳輸數據的基本單位。 IP數據報頭部 版本(Version) 4bit 告訴我們使用的是哪種IP協議。IPv4版本是“4”,IPv6版本是“6”。 頭部長度(IHL,Intern…

Leetcode 2158. 每天繪制新區域的數量【Plus題】

1.題目基本信息 1.1.題目描述 有一幅細長的畫,可以用數軸來表示。 給你一個長度為 n 、下標從 0 開始的二維整數數組 paint ,其中 paint[i] [starti, endi] 表示在第 i 天你需要繪制 starti 和 endi 之間的區域。 多次繪制同一區域會導致不均勻&…

Git Flow

Git Flow深度解析:企業級分支管理實戰指南 前言 在持續交付時代,分支策略決定團隊協作效率。Git Flow作為經典的分支管理模型,被Apache、Spring等知名項目采用。2023年JetBrains開發者調查報告顯示,Git Flow仍是中大型項目最常用…

[Swift]pod install成功后運行項目報錯問題error: Sandbox: bash(84760) deny(1)

操作: platform :ios, 14.0target ZKMKAPP do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!# Pods for ZKMKAPPpod Moyaend pod install成功后運行報錯 報錯: error: Sandbox: bash(84760) deny(1) file-writ…

[管理與領導-129]:向上管理-組織架構、股權架構、業務架構、流程架構,看每個人在組織中的位置和重要性

目錄 一、股權架構:反映所有權與控制權 二、組織架構:定義角色與匯報關系 三、業務架構:定義業務單元與價值鏈 四、流程架構:規范業務運作與協作 五、綜合分析:個人在組織中的綜合影響力 六、案例:某…

小紅書爬蟲,小紅書api,小紅書數據挖掘

背景: 小紅書(Xiaohongshu)是一款結合社交、購物和內容分享的移動應用,近年來在中國以及全球范圍內擁有大量的用戶群體。小紅書上的內容包括用戶的消費體驗、生活方式、旅行分享、時尚搭配等。通過這些內容,用戶可以了…