@Transactional 是 Spring 聲明式事務核心。本文系統講解屬性配置、回滾規則、傳播行為七大類型、唯讀優化與最佳實踐。
@Transactional // 類上:所有 public 方法開啟事務
@Service
public class UserService { ... }
@Transactional(readOnly = true) // 唯讀優化:不開啟事務/鎖,適合查詢
public User findById(Long id) { ... }
@Transactional(rollbackFor = Exception.class):所有異常 (含 Checked) 回滾。@Transactional(noRollbackFor = MyBusinessException.class):指定異常不回滾。| 枚舉值 | 行為描述 | 典型場景 |
|---|---|---|
| REQUIRED (預設) | 有事務加入,無則新建 | 通用業務方法 |
| SUPPORTS | 有事務加入,無則以非事務執行 | 純查詢、日誌記錄 |
| MANDATORY | 必須在現有事務中執行,否則拋異常 | 強制要求事務上下文的核心操作 |
| REQUIRES_NEW | **掛起現有事務,新建獨立事務** | 獨立審計日誌、發送通知、嘗試性操作 |
| NOT_SUPPORTED | **掛起現有事務,以非事務執行** | 長時間查詢、外部 API 呼叫不想持有連線 |
| NEVER | 不能在事務中執行,否則拋異常 | 強制非事務環境 |
| NESTED | 有事務則建立**巢狀事務 (Savepoint)**,無則同 REQUIRED | 細粒度回滾 (僅回滾內層),需 DataSourceTransactionManager 支援 |
this.method() 繞過代理,**需注入自身或拆分類** 解決。PlatformTransactionManager (如 DataSourceTransactionManager / JtaTransactionManager)。isolation 預設資料庫預設 (通常 READ_COMMITTED);高併發可調 REPEATABLE_READ 或 SERIALIZABLE (效能代價大)。@Transactional,DAO 層不加。readOnly=true。rollbackFor。