Java學習手冊:Spring 事務管理

Spring 事務管理

一、事務管理的概念

事務是一組操作的集合,這些操作要么全部成功,要么全部失敗。事務管理的目的是保證數據的一致性和完整性。在數據庫操作中,事務管理尤為重要,例如銀行轉賬、訂單支付等場景都需要事務管理來確保數據的正確性。

二、Spring 事務管理的優勢

  • 聲明式事務管理 :Spring 提供了聲明式事務管理,使得事務管理變得更加簡單和便捷。開發者可以通過配置文件或注解來指定哪些方法需要進行事務管理,而無需在代碼中編寫大量的事務管理代碼,從而減少了代碼的重復和耦合。
  • 集成性強 :Spring 的事務管理可以與多種數據訪問技術集成,如 JDBC、Hibernate、JPA 等,提供了統一的事務管理接口,使得開發者可以在不同的數據訪問技術之間切換,而無需改變事務管理的代碼。
  • 靈活的配置 :Spring 事務管理提供了多種配置方式,包括 XML 配置、注解配置等,可以根據項目的需求靈活選擇。

三、Spring 事務管理的類型

  • 編程式事務管理 :通過編寫代碼來控制事務的開始、提交和回滾,使用 TransactionTemplatePlatformTransactionManager 來實現。這種方式提供了更細粒度的事務控制,但代碼相對繁瑣。
  • 聲明式事務管理 :通過配置文件或注解來定義事務規則,Spring 自動管理事務的開始、提交和回滾。這種方式將事務管理代碼從業務邏輯中分離出來,提高了代碼的可維護性,是 Spring 事務管理的主要使用方式。

四、Spring 事務管理的配置

1. XML 配置

在 XML 配置文件中,使用 <tx:advice> 標簽來定義事務通知,使用 <aop:config> 標簽來定義切面,將事務通知應用到指定的 Bean 上。

示例代碼

<beans><!-- 配置數據源 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"></property><property name="username" value="root"></property><property name="password" value="password"></property></bean><!-- 配置 JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 配置事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 配置事務通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" propagation="REQUIRED" /></tx:attributes></tx:advice><!-- 配置 AOP 切面 --><aop:config><aop:pointcut id="servicePointcut" expression="execution(* com.example.service.*.*(..))"></aop:pointcut><aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"></aop:advisor></aop:config><!-- 配置 Service Bean --><bean id="userService" class="com.example.service.UserService"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean>
</beans>
2. 注解配置

使用 @EnableTransactionManagement 注解啟用事務管理,使用 @Transactional 注解來標注需要進行事務管理的類或方法。

示例代碼

@Configuration
@EnableTransactionManagement
public class AppConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC");dataSource.setUsername("root");dataSource.setPassword("password");return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}@Service
public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Transactionalpublic void transferMoney(Account fromAccount, Account toAccount, Double amount) {jdbcTemplate.update("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, fromAccount.getId());jdbcTemplate.update("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, toAccount.getId());}
}

五、Spring 事務的傳播行為

事務傳播行為定義了多個事務方法之間如何相互影響和協作。常見的傳播行為包括:

  • REQUIRED :如果當前存在事務,則加入該事務;如果不存在,則創建一個新的事務。這是默認的傳播行為。
  • SUPPORTS :如果當前存在事務,則加入該事務;如果不存在,則以非事務的方式執行。
  • MANDATORY :如果當前存在事務,則加入該事務;如果不存在,則拋出異常。
  • REQUIRES_NEW :總是創建一個新的事務。如果當前存在事務,則將當前事務掛起,創建一個新的事務。
  • NOT_SUPPORTED :以非事務的方式執行。如果當前存在事務,則將當前事務掛起。
  • NEVER :以非事務的方式執行。如果當前存在事務,則拋出異常。
  • NESTED :如果當前存在事務,則創建一個嵌套事務;如果不存在,則創建一個新的事務。嵌套事務是外部事務的一部分,對外部事務的回滾有影響。

六、Spring 事務的隔離級別

事務隔離級別用于控制多個事務之間的數據可見性和并發訪問的限制。常見的隔離級別包括:

  • READ_UNCOMMITTED :最低的隔離級別,允許臟讀(讀取未提交的事務數據)。在實際應用中很少使用。
  • READ_COMMITTED :只允許讀取已提交的事務數據,避免了臟讀。這是大多數數據庫的默認隔離級別。
  • REPEATABLE_READ :保證在同一個事務中多次讀取同一數據時,結果是一致的。避免了不可重復讀,但可能會出現幻讀。
  • SERIALIZABLE :最高的隔離級別,完全隔離事務之間的操作,避免了臟讀、不可重復讀和幻讀。但性能開銷較大,通常只在對數據一致性要求極高的場景下使用。

七、總結

Spring 提供了強大而靈活的事務管理功能,通過聲明式事務管理,可以大大簡化事務管理的代碼,提高開發效率和代碼的可維護性。在實際開發中,可以根據項目的需求選擇合適的事務傳播行為和隔離級別,確保數據的一致性和完整性。Spring 的事務管理與多種數據訪問技術集成,為開發高質量的企業級應用提供了有力的支持。掌握 Spring 事務管理的配置和使用方法,是構建可靠、穩定的應用系統的重要技能。

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

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

相關文章

echarts自定義圖表--柱狀圖-橫向

區別于縱向表格 xAxis和yAxis對調 要將label全部固定到最右側&#xff1a; 隱藏一個柱形 為每個label設置固定的偏移距離 offset: [300 - 80, 0] 在data中加入label的配置 根據現在的值生成距離右側的偏移 更新方法 chart.setOption({series: [{},{data: data.map(v > ({v…

【CV數據集】Visdrone2019無人機目標檢測數據集(YOLO、VOC、COCO格式)

visdrone2019的Task1是非常通用的目標檢測數據集&#xff0c;也是許多人做目標檢測論文和項目必然會用到的數據集&#xff0c;我將該數據集進行了處理&#xff0c;將其YOLO、VOC和COCO格式都整理好&#xff0c;通過下載我整理好的數據集和相關文件&#xff0c;可以直接在自己的…

常見電源的解釋說明

英文縮寫 BJT&#xff08;bipolar junction transistor&#xff09;雙極型結晶體管FET&#xff08;field-effect transistor&#xff09;場效應管TTL&#xff08;Transistor-Transistor Logic&#xff09;三極管CMOS&#xff08;Complementary Metal Oxide Semiconductor&…

【2025年五一數學建模競賽】A題 解題思路與模型代碼

2025年五一數學建模競賽 A題 問題一&#xff1a;推測支路 1 和支路 2 的車流量 1.1 問題描述 根據提供的主路歷史數據以及已知的支路車流量變化趨勢&#xff08;支路1呈線性增長&#xff0c;支路2先線性增長后線性減少&#xff09;&#xff0c;推測這兩個支路在特定時間段&a…

d202551

目錄 一、175. 組合兩個表 - 力扣&#xff08;LeetCode&#xff09; 二、511. 游戲玩法分析 I - 力扣&#xff08;LeetCode&#xff09; 三、1204. 最后一個能進入巴士的人 - 力扣&#xff08;LeetCode&#xff09; 一、175. 組合兩個表 - 力扣&#xff08;LeetCode&#xf…

RISC-V AIA SPEC學習(四)

第五章 Interrupts for Machine andSupervisor Levels 核心內容?? 1.主要中斷類型與默認優先級:?? 定義了機器級別(M-level)和監管者級別(S-level)的標準中斷類型(如MEI、SEI、MTI等)。默認優先級規則:本地中斷(如軟件/定時器)優先級高于外部中斷,RAS事件(如低/高…

WSGI(Web Server Gateway Interface)服務器

0、什么是 WSGI WSGI &#xff08;Web Server Gateway Interface&#xff09; 是一種Python規范&#xff0c;它定義了 Web 服務器 和 Python Web 應用程序之間的通信接口。 即&#xff0c;能夠讓各種 Web 服務器&#xff08;如 Nginx、Apache 等&#xff09;和 Python Web 框架…

博客打卡-人類基因序列功能問題動態規劃

題目如下&#xff1a; 眾所周知&#xff0c;人類基因可以被認為是由4個核苷酸組成的序列&#xff0c;它們簡單的由四個字母A、C、G和T表示。生物學家一直對識別人類基因和確定其功能感興趣&#xff0c;因為這些可以用于診斷人類疾病和設計新藥物。 生物學家確定新基因序列功能…

基本功能學習

一.enum枚舉使用 E_SENSOR_REQ_NONE 的定義及用途 在傳感器驅動開發或者電源管理模塊中&#xff0c;E_SENSOR_REQ_NONE通常被用來表示一種特殊的狀態或請求模式。這種狀態可能用于指示當前沒有活動的傳感器請求&#xff0c;或者是默認初始化狀態下的一種占位符。 可能的定義…

vitest | 測試框架vitest | 總結筆記

目錄 測試框架 vitest 介紹 測試文件的寫法 文件取名&#xff1a;文件名中要有 test&#xff0c;即 xxx.test.ts 引入庫&#xff1a; test 測試&#xff1a; 測試運行&#xff1a; npx test 文件名 &#xff0c;每次保存后會重新運行。 ★ expect 方法&#xff1a; v…

ESP32開發-作為TCP客戶端發送數據到網絡調試助手

??代碼&#xff08;作為TCP客戶端&#xff09;?? #include <SPI.h> #include <EthernetENC.h> // 使用EthernetENC庫// 網絡配置 byte mac[] {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // MAC地址 IPAddress ip(192, 168, 1, 100); // ESP32的IP IPAddr…

HTML5 WebSocket:實現高效實時通訊

一、引言 在當今的 Web 開發領域,實時通訊功能變得越來越重要。例如在線聊天、實時數據更新等場景都需要客戶端與服務器之間能夠進行高效的雙向數據傳輸。HTML5 引入的 WebSocket 協議為我們提供了一種強大的解決方案,它在單個 TCP 連接上實現了全雙工通訊,極大地改善了傳統…

速通Ollama本地部署DeepSeek-r1

下載 Ollama 前往 Ollama官網 下載客戶端&#xff0c;下載完成后點擊Install安裝即可。 完成后會自動安裝在C:盤的AppData文件夾下&#xff0c;命令行輸入ollama后&#xff0c;顯示下圖中的信息表明安裝成功。 下載模型 在官網界面點擊 DeepSeek-R1 超鏈接 跳轉到DeepSeek安裝…

總結C++中的STL

1.STL 概述 STL 即標準模板庫&#xff0c;是 C 標準程序庫的重要組成部分&#xff0c;包含常用數據結構和算法&#xff0c;體現了泛型化程序設計思想&#xff0c;基于模板實現&#xff0c;提高了代碼的可復用性 2.容器 2.1 序列容器&#xff1a; 1. vector 特性&#xff…

自動駕駛-一位從業兩年的獨特視角

時間簡介 2023.03 作為一名大三學生&#xff0c;加入到某量產車企&#xff0c;從事地圖匹配研發 2023.07 地圖匹配項目交付&#xff0c;參與離線云端建圖研發 2023.10 拿到24屆校招offer 2024.07 正式入職 2025.01 離線云端建圖穩定&#xff0c;開始接觸在線車端融圖研發 自動…

《軟件設計師》復習筆記(11.1)——生命周期、CMM、開發模型

目錄 一、信息系統生命周期 系統規劃階段 系統分析階段&#xff08;邏輯設計&#xff09; 系統設計階段&#xff08;物理設計&#xff09; 系統實施階段 系統運行與維護階段 二、能力成熟度模型&#xff08;CMM/CMMI&#xff09; CMM 五級模型 CMMI 兩種表示方法 真題…

1.67g 雨晨 22635.5305 Windows 11 企業版 23H2 極速增強版

五一特別制作 &#xff08;主要更新簡述&#xff09; 全程由最新YCDISM2025裝載制作 1、可選功能&#xff1a; 添加&#xff1a; Microsoft-Windows-LanguageFeatures-Basic-en-us-Package Microsoft-Windows-LanguageFeatures-OCR-en-us-Package 2、功能增強&a…

爬蟲逆向思維

爬蟲逆向思維是指從目標網站的反爬機制入手&#xff0c;通過分析其防護邏輯來突破限制&#xff0c;獲取數據的思路。以下是核心要點&#xff1a; 核心方向 - 分析反爬手段&#xff1a;如請求頭校驗、IP封禁、驗證碼、動態數據加密等。 - 模擬真實行為&#xff1a;偽造瀏覽器指…

手撕哈希表

引入&#xff1a;unordered_set /map是什么&#xff1f; 庫里面除開set和map&#xff0c;還有unordered_set 和 unordered_map&#xff0c;區別在于&#xff1a; ①&#xff1a;set和map的底層結構是紅黑樹&#xff0c;而unordered_set和unordered_map的底層是哈希表 ②&…

基于Docker的內網穿透實戰:frp 0.68 + Nginx最佳實踐

在實際應用中&#xff0c;我們常常遇到這樣的需求&#xff1a; 家里的NAS服務器、開發環境、測試服務&#xff0c;需要暴露到公網訪問 企業內部系統&#xff0c;僅允許在特定域名或端口暴露&#xff0c;但沒有公網IP 多個內網應用&#xff0c;希望通過一個統一的外網入口訪問…