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

Spring @Transactional 事務管理與傳播行為完全指南

     編輯:Java 相關知識

@Transactional 是 Spring 聲明式事務核心。本文系統講解屬性配置、回滾規則、傳播行為七大類型、唯讀優化與最佳實踐。

基礎用法

@Transactional // 類上:所有 public 方法開啟事務
@Service
public class UserService { ... }

@Transactional(readOnly = true) // 唯讀優化:不開啟事務/鎖,適合查詢
public User findById(Long id) { ... }

回滾規則自訂

  • 預設:**RuntimeException / Error** 觸發回滾;Checked Exception **不回滾**。
  • @Transactional(rollbackFor = Exception.class):所有異常 (含 Checked) 回滾。
  • @Transactional(noRollbackFor = MyBusinessException.class):指定異常不回滾。

傳播行為 (Propagation) 七大類型

枚舉值行為描述典型場景
REQUIRED (預設)有事務加入,無則新建通用業務方法
SUPPORTS有事務加入,無則以非事務執行純查詢、日誌記錄
MANDATORY必須在現有事務中執行,否則拋異常強制要求事務上下文的核心操作
REQUIRES_NEW**掛起現有事務,新建獨立事務**獨立審計日誌、發送通知、嘗試性操作
NOT_SUPPORTED**掛起現有事務,以非事務執行**長時間查詢、外部 API 呼叫不想持有連線
NEVER不能在事務中執行,否則拋異常強制非事務環境
NESTED有事務則建立**巢狀事務 (Savepoint)**,無則同 REQUIRED細粒度回滾 (僅回滾內層),需 DataSourceTransactionManager 支援

核心原理提醒

  • **僅對 public 方法生效** (protected/private/package-private 不會織入)。
  • **自我調用失效**:同類內部 this.method() 繞過代理,**需注入自身或拆分類** 解決。
  • 資料源需配置 PlatformTransactionManager (如 DataSourceTransactionManager / JtaTransactionManager)。
  • 隔離級別 isolation 預設資料庫預設 (通常 READ_COMMITTED);高併發可調 REPEATABLE_READ 或 SERIALIZABLE (效能代價大)。

最佳實踐清單

  1. Service 層加 @Transactional,DAO 層不加。
  2. 查詢方法加 readOnly=true。
  3. 業務邏輯拋出 Checked Exception 需回滾 → 明確 rollbackFor。
  4. 跨服務調用需分散式事務 → 引入 Seata/Atomikos (JTA) 或採用最終一致性模式 (TCC/Saga)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved