深入理解 Spring:事務管理與事件機制全解析

文章目錄

  • 前言
  • 一、Spring 事務管理(Transaction Management)
    • 1. 使用 @Transactional 管理事務
    • 2. 核心屬性說明
    • 3. 事務傳播行為詳解(Propagation)
    • 4. 異常回滾策略分析
    • 5. 底層原理剖析(源碼級)
  • 二、Spring 事件機制(ApplicationEvent)
    • 1.定義自定義事件類
    • 2. 發布事件
    • 3. 監聽事件(兩種方式)
    • 4. 異步監聽事件
    • 5. 控制事件監聽器優先級
    • 避坑提醒:
  • 總結


在這里插入圖片描述

前言

在開發復雜的企業級系統時,Spring 框架的事務管理和事件機制是兩個不可或缺的核心模塊。本文將從實際開發出發,全面講解 Spring 的事務處理原理、事件發布-監聽機制,并深入剖析常被忽視但極其重要的細節:事務傳播行為、異常回滾策略與事件優先級控制,幫助你在關鍵業務場景中少踩坑,提升系統健壯性與可維護性。


一、Spring 事務管理(Transaction Management)

Spring 提供了聲明式和編程式兩種事務管理方式,聲明式事務結合注解與 AOP,更加簡潔、優雅。

1. 使用 @Transactional 管理事務

@Service
public class OrderService {@Transactionalpublic void createOrder() {// 插入訂單// 扣減庫存// 插入操作日志}
}

2. 核心屬性說明

屬性含義
propagation事務傳播行為(默認:REQUIRED)
isolation事務隔離級別(如 READ_COMMITTED)
rollbackFor指定哪些異常類型觸發回滾
readOnly是否只讀,適用于查詢優化
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,rollbackFor = Exception.class
)

3. 事務傳播行為詳解(Propagation)

Spring 定義了 7 種事務傳播行為,用于處理不同事務上下文嵌套關系:

類型含義
REQUIRED默認,存在事務則加入,否則新建
REQUIRES_NEW總是新建事務,掛起當前事務
NESTED嵌套事務,支持回滾到 Savepoint
SUPPORTS有事務則加入,無則非事務執行
NOT_SUPPORTED永遠非事務,掛起當前事務
MANDATORY必須存在事務,否則拋異常
NEVER禁止事務,有事務就拋異常
@Transactional
public void methodA() {methodB(); // 默認 REQUIRED
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {// 新事務
}

注意:REQUIRES_NEW 將暫停 methodA 的事務,獨立執行和提交/回滾 methodB。

4. 異常回滾策略分析

默認行為:

  • 運行時異常(RuntimeException):自動回滾
  • 受檢異常(Exception):默認不回滾,需手動指定

顯式配置:

@Transactional(rollbackFor = Exception.class)
public void method() throws Exception {throw new Exception("不會默認回滾,需配置 rollbackFor");
}

5. 底層原理剖析(源碼級)

Spring 聲明式事務的核心實現類為:

  • TransactionInterceptor:事務切面攔截器
  • PlatformTransactionManager:統一事務管理接口
  • DataSourceTransactionManager:JDBC 實現
  • TransactionAspectSupport:控制事務的實際邏輯

流程:

  • 代理對象攔截方法調用;
  • TransactionInterceptor.invoke() 判斷事務屬性;
  • 調用 AbstractPlatformTransactionManager#getTransaction() 創建事務;
  • 執行目標方法;
  • 根據是否異常決定提交或回滾。

二、Spring 事件機制(ApplicationEvent)

Spring 內置發布-訂閱模型,可用于解耦系統模塊,處理異步或擴展性強的邏輯,如日志、通知、審計等。

1.定義自定義事件類

public class UserRegisteredEvent extends ApplicationEvent {private final String username;public UserRegisteredEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() {return username;}
}

2. 發布事件

@Component
public class UserService {@Autowiredprivate ApplicationEventPublisher publisher;public void register(String username) {// 注冊業務邏輯publisher.publishEvent(new UserRegisteredEvent(this, username));}
}

3. 監聽事件(兩種方式)

方式一:實現接口 ApplicationListener

@Component
public class EmailNotifier implements ApplicationListener<UserRegisteredEvent> {public void onApplicationEvent(UserRegisteredEvent event) {System.out.println("發送歡迎郵件給:" + event.getUsername());}
}

方式二:注解方式 @EventListener

@Component
public class SmsNotifier {@EventListenerpublic void handle(UserRegisteredEvent event) {System.out.println("發送短信通知:" + event.getUsername());}
}

4. 異步監聽事件

@EnableAsync
@Configuration
public class AsyncConfig {// 配置線程池等
}

監聽器加 @Async:

@Async
@EventListener
public void asyncHandle(UserRegisteredEvent event) {// 異步通知
}

5. 控制事件監聽器優先級

多個監聽器響應同一事件時,可通過以下方式控制執行順序:

使用 @Order

@Order(1)
@EventListener
public void firstHandler(MyEvent event) {// 優先執行
}

實現 SmartApplicationListener

@Component
public class HighPriorityListener implements SmartApplicationListener {public int getOrder() {return 0;}public void onApplicationEvent(ApplicationEvent event) {// 最優先執行}public boolean supportsEventType(Class<?> eventType) {return eventType == MyEvent.class;}
}

底層通過 AnnotationAwareOrderComparator 排序后執行。

避坑提醒:

  • 內部方法調用不會觸發 @Transactional(繞過代理)
  • @Transactional 默認僅回滾運行時異常
  • 事件監聽器順序未設置可能導致邏輯混亂
  • 事務+事件混用時注意異步監聽器提前執行(事務未提交)

總結

本文深入解析Spring框架的事務管理和事件機制兩大核心功能。在事務管理方面,詳細介紹了@Transactional注解的使用、7種事務傳播行為、異常回滾策略及底層實現原理;在事件機制方面,講解了自定義事件定義、發布訂閱模式實現、異步監聽及優先級控制。文章特別強調了實際開發中的常見陷阱,如內部方法調用失效、異常回滾范圍、事件監聽順序等問題,幫助開發者避免潛在錯誤。通過掌握這些關鍵知識點,能夠有效提升企業級應用的可靠性、可維護性和擴展性。

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

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

相關文章

AWD練習的平臺搭建

ubuntu虛擬機搭建 前提資源準備 進行AWD我們需要在一個獨立的虛擬機 現在就來搭建一個ubuntu的 這里我們使用的VMware是17的 然后下載鏡像的地址&#xff1a;Ubuntu最全的國內鏡像下載地址 - 嗶哩嗶哩 我下載的是中科大的 這里需要準備的前提資源就有了。 創建Ubuntu虛…

C++ 詳談繼承體系下的構造函數和析構函數

前言 前面呢, 我們說了C中實現多態的原理, 其中也說了, 虛函數表和虛函數指針的創建時機, C 詳談多態實現原理-CSDN博客 , 這一節呢, 我們會說說在C中繼承體系下的另一個知識點, 那就是: 繼承體系下的構造函數和析構函數~~, 主要圍繞兩個問題: 執行順序? 虛析構函數的作用? …

PostgreSQL 字段類型速查與 Java 枚舉映射

1. 查詢 SQLSELECTc.table_schema,c.table_name,c.column_name,c.data_type,c.udt_name,CASE-- 數值WHEN c.udt_name IN (int2,int4,int8,float4,float8,numeric,money)THEN NUMERIC-- 布爾WHEN c.udt_name boolTHEN BOOLEAN-- 日期/時間WHEN c.udt_name IN (date,time,timetz…

數據分析綜合應用 30分鐘精通計劃

?? 數據分析綜合應用 30分鐘精通計劃(完整版含輸出) ? 時間分配 5分鐘:數據加載與清洗基礎 10分鐘:探索性數據分析(EDA) 10分鐘:數據分析實戰案例 5分鐘:分析報告生成 ?? 第一部分:數據加載與清洗基礎 (5分鐘) 1. 模擬真實數據集 import pandas as pd import nu…

Python爬蟲實戰:研究psd-tools庫相關技術

一、引言 1.1 研究背景 Adobe Photoshop 是目前最流行的圖像處理軟件之一,其原生文件格式 PSD(Photoshop Document)包含了豐富的圖像信息和編輯歷史。PSD 文件不僅在設計領域廣泛使用,還在數字營銷、版權保護和安全分析等領域具有重要價值。然而,手動分析大量 PSD 文件是…

基于卷積傅里葉分析網絡 (CFAN)的心電圖分類的統一時頻方法

一、研究背景與核心問題??ECG分類的挑戰?&#xff1a;心電圖&#xff08;ECG&#xff09;信號分類在心律失常檢測、身份識別等領域至關重要&#xff0c;但傳統方法難以同時有效整合時域和頻域信息。現有方法包括&#xff1a;?時域分類&#xff08;CNN1D&#xff09;??&am…

Linux——LinuxOS

cd,pwd,mkdir,rm,ls,touch,cat,echo,

深度學習篇---矩陣

在機械臂解算、深度學習網絡等硬件和軟件領域中&#xff0c;矩陣運算作為核心數學工具&#xff0c;承擔著數據表示、變換、映射和優化的關鍵作用。以下從具體領域出發&#xff0c;詳細總結涉及的矩陣運算及對應的核心知識&#xff1a;一、機械臂解算領域機械臂解算&#xff08;…

元宇宙:技術烏托邦與數字化未來——基于技術哲學的分析

一、技術哲學視域下的元宇宙本質哲學源流與技術基因的雙重映射理想世界的千年回響&#xff1a;從柏拉圖洞穴隱喻中的影子世界&#xff0c;到普特南“缽中之腦”對虛擬與現實界限的消弭&#xff0c;元宇宙的構想深植于人類對平行世界的永恒追問。中國傳統神話中“天人二元結構”…

如何構建一個基于大模型的實時對話3D數字人?

近年來&#xff0c;隨著元宇宙和AIGC技術的爆發&#xff0c;3D數字人從影視特效走向日常應用。無論是虛擬主播、AI客服&#xff0c;還是數字教師&#xff0c;其核心訴求都是**“能聽、會說、有表情”**的實時交互能力。本文就帶大家了解如何構建一個基于大模型的實時對話的3D數…

NULL值處理:索引優化與業務設計實踐指南

一、NULL值的本質與影響NULL值在數據庫中代表"未知狀態"或"不適用"的特殊標記&#xff0c;與空字符串或0有本質區別12。其特性導致以下業務與性能問題&#xff1a;?語義復雜性?&#xff1a;NULL可能表示"未填寫"(如用戶手機號)或"不適用&…

【add vs commit】Git 中的 add 和 commit 之間的區別

關于git add和git commit還有一些有點不太清楚的地方&#xff0c;這里寫一篇文章好好理一理git add&#xff1a;添加到暫存區 git add實際上是把工作區中的內容存入“暫存區” 通俗來講就是告訴Git&#xff1a;“這些文件我準備好commit了” git add file.txt # 添加單個文件 …

【推薦100個unity插件】使用C#或者unity實現爬蟲爬取靜態網頁數據——Html Agility Pack (HAP)庫和XPath 語法的使用

文章目錄前言一、安裝HtmlAgilityPack1、從NuGet下載HtmlAgilityPack包2、獲取HtmlAgilityPack.dll二、HtmlAgilityPack常用操作1、加載 HTML2、查詢方式2.1 使用 XPath 查詢&#xff08;推薦&#xff09;2.2 使用 LINQ 查詢3、常用查詢操作3.1 選擇節點3.2 獲取屬性值3.3 遍歷…

用 urllib 開啟爬蟲之門:從零掌握網頁數據抓取

在數字時代&#xff0c;數據就是力量。作為一名社會工作者&#xff0c;或許你想了解城市服務資源&#xff1b;作為一個編程初學者&#xff0c;你可能希望從網頁中自動提取新聞、課程或公開數據。今天&#xff0c;我們就來講一講 Python 標準庫中的一把“鑰匙”——urllib 庫&am…

Spring Boot 訂單超時自動取消的 3 種主流實現方案

Spring Boot 訂單超時自動取消的 3 種主流實現方案關鍵詞&#xff1a;Spring Boot、訂單超時、延遲任務、RabbitMQ、Redis、定時任務在電商、外賣、票務等業務中&#xff0c;“下單后若 30 分鐘未支付則自動取消”是一道經典需求。實現方式既要保證 實時性&#xff0c;又要在 高…

0401聚類-機器學習-人工智能

文章目錄一 無監督學習什么是無監督學習&#xff1f;核心特點&#xff1a;無監督學習的主要類型1. 聚類分析 (Clustering)2. 降維 (Dimensionality Reduction)3. 關聯規則學習 (Association Rule Learning)4. 異常檢測 (Anomaly Detection)5. 密度估計 (Density Estimation)二 …

基礎神經網絡模型搭建

nn 包提供通用深度學習網絡的模塊集合&#xff0c;接收輸入張量&#xff0c;計算輸出張量&#xff0c;并保存權重。通常使用兩種途徑搭建 PyTorch 中的模型&#xff1a;nn.Sequential和 nn.Module。 nn.Sequential通過線性層有序組合搭建模型&#xff1b;nn.Module通過__init__…

基于單片機出租車計價器設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的智能化出租車計價系統。系統以單片機為核心處理器&#xff0c;集成…

134. Java 泛型 - 上限通配符

文章目錄134. Java 泛型 - 上限通配符 (? extends T)**1. 什么是上限通配符 (? extends T)&#xff1f;****2. 為什么使用 ? extends T&#xff1f;****3. 示例&#xff1a;使用 ? extends T 進行數據讀取****? 示例 1&#xff1a;計算數值列表的總和****4. 注意事項&…

【1】YOLOv13 AI大模型-可視化圖形用戶(GUI)界面系統開發

【文章內容適用于任意目標檢測任務】【GUI界面系統不局限于YOLOV13&#xff0c;主流YOLO系列模型同樣適用】本文以車輛行人檢測為背景&#xff0c;介紹基于【YOLOV13模型】和【AI大模型】的圖形用戶&#xff08;GUI&#xff09;界面系統的開發。助力大論文實現目標檢測模型的應…