首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 事務傳播屬性深度解析與實戰應用

     編輯:Java 相關知識

前言

Spring 聲明式事務的核心在於傳播行為,定義當事務方法被另一個事務方法呼叫時,事務如何邊界延伸或隔離。TransactionDefinition 介面定義了 7 種傳播屬性,本文逐一解析並結合實例說明行為差異。

七種傳播屬性速查表

常數行為描述典型用途
PROPAGATION_REQUIRED支援目前事務;若無則新建。最常用。一般業務方法
PROPAGATION_SUPPORTS支援目前事務;若無則以非事務方式執行。唯讀查詢、不需事務保護的操作
PROPAGATION_MANDATORY必須在現有事務中執行;若無則拋出異常。強制要求事務上下文的核心邏輯
PROPAGATION_REQUIRES_NEW**新建事務**;若有現有事務則掛起。獨立提交/回滾的操作(如日誌記錄、審計)
PROPAGATION_NOT_SUPPORTED以非事務方式執行;若有現有事務則掛起。不需事務、效能優先的操作
PROPAGATION_NEVER以非事務方式執行;若有現有事務則拋出異常。嚴禁事務環境的特殊邏輯
PROPAGATION_NESTED支援目前事務,設定儲存點;與外層事務同步提交/回滾。部分回滾、多階段提交的複雜業務

情境模型

ServiceA {
    void methodA() {
        ServiceB.methodB();
    }
}
ServiceB {
    void methodB() { /* ... */ }
}

假設 methodA 與 methodB 分別配置不同傳播屬性,分析互動行為。

詳細行為分析

1. PROPAGATION_REQUIRED(預設、最常用)

  • methodA 有事務 → methodB 加入同一事務。
  • methodA 無事務 → methodB 新建事務。
  • 任一方異常 → **整個事務回滾**(含 methodB 已做的操作)。

2. PROPAGATION_SUPPORTS

  • 有事務則加入,無事務則非事務執行。
  • 適合不修改資料的查詢方法。

3. PROPAGATION_MANDATORY

  • 強制要求呼叫者已開啟事務,否則拋 IllegalTransactionStateException。
  • 用於核心業務邏輯,防止被非事務環境誤呼叫。

4. PROPAGATION_REQUIRES_NEW

  • methodB **永遠在獨立新事務**執行,methodA 事務掛起。
  • methodB 提交後,methodA 回滾**不影響** methodB。
  • methodB 回滾若被 methodA 捕獲異常,methodA 仍可選擇提交。
  • 典型應用:**日誌記錄、審計追蹤**——即使主業務失敗,日誌仍須保留。

5. PROPAGATION_NOT_SUPPORTED

  • methodB 以非事務方式執行,methodA 事務掛起等待。
  • 適合不需資料一致性保護、追求效能的操作。

6. PROPAGATION_NEVER

  • 若呼叫者有事務則拋異常,強制非事務環境。
  • 極少用,僅用於嚴禁事務的特殊場景。

7. PROPAGATION_NESTED(JDBC 3.0+ 支援)

  • 在現有事務內設定 **Savepoint**,屬於**巢狀事務**。
  • 外層事務回滾 → 內層也回滾;內層回滾 → 外層可選擇回滾到 Savepoint 並嘗試其他分支。
  • 程式碼範例:
void methodA() {
    try {
        ServiceB.methodB(); // NESTED
    } catch (Exception e) {
        // 回滾到 Savepoint,嘗試替代方案
        ServiceC.methodC();
    }
}

與 REQUIRES_NEW 差異:NESTED 依賴外層事務,**無獨立提交**,提交/回滾與外層同步;REQUIRES_NEW 完全獨立。

選擇建議

  • **90% 情況用 REQUIRED**——簡單、符合直覺。
  • **需獨立提交(日誌、通知)→ REQUIRES_NEW**。
  • **複雜多階段、需部分回滾 → NESTED**(確認資料庫支援 Savepoint)。
  • **唯讀查詢 → SUPPORTS** 或 **readOnly=true**。
  • **核心邏輯防誤用 → MANDATORY**。

結語

精通事務傳播屬性,能精準控制事務邊界,避免資料不一致或效能浪費。實務上以 REQUIRED 為主,輔以 REQUIRES_NEW 處理獨立副作用,NESTED 處理複雜回滾邏輯,構建健壯的事務架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved