事務管理是企業級應用的基石,Spring 通過抽象事務管理器層屏蔽底層 API 差異,提供統一的編程式與聲明式事務支持。本文系統梳理 Spring 事務管理器體系、五大事務屬性、七種傳播行為、五級隔離級別,並給出生產環境配置最佳實踐。
| 特性 | 英文 | 核心含義 |
|---|---|---|
| 原子性 | Atomicity | 事務內操作要麼全成功、要麼全失敗,不可分割 |
| 一致性 | Consistency | 事務完成後,數據從一個一致性狀態轉移到另一個一致性狀態 |
| 隔離性 | Isolation | 並發事務互不干擾,通過鎖/MVCC 實現 |
| 持久性 | Durability | 提交後的修改永久保存,掉電不丟失(WAL/Redo Log) |
TransactionTemplate 或 PlatformTransactionManager,侵入性強,靈活度高,適用於極少數精細控制場景@Transactional 或 XML 配置分離事務邏輯,非侵入式,橫切關注點模塊化Spring 不直接管理事務,而是委託給特定平台的事務實現:
| 管理器類 | 包路徑 | 適用場景 | 底層委託對象 |
|---|---|---|---|
| DataSourceTransactionManager | org.springframework.jdbc.datasource | JDBC、iBATIS、MyBatis | java.sql.Connection |
| HibernateTransactionManager | org.springframework.orm.hibernate3/4/5 | Hibernate 3.2+ | org.hibernate.Transaction |
| JpaTransactionManager | org.springframework.orm.jpa | JPA (Hibernate/EclipseLink) | javax.persistence.EntityManager |
| JdoTransactionManager | org.springframework.orm.jdo | JDO | javax.jdo.PersistenceManager |
| JtaTransactionManager | org.springframework.transaction.jta | 分布式事務、多資源協調 | Java EE 容器 JTA TransactionManager |
| OC4JjtaTransactionManager | org.springframework.transaction.jta | Oracle OC4J 10.1.3+ | 容器高級事務 |
| WebSphereUowTransactionManager | org.springframework.transaction.jta | WebSphere 6.0+ | 容器 UOW Manager |
| WebLogicJtaTransactionManager | org.springframework.transaction.jta | WebLogic 8.1+ | 容器 JTA Manager |
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaDialect" ref="jpaDialect"/>
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
<beans xmlns:jee="https://www.springframework.org/schema/jee" ...>
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/test"/>
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:comp/TransactionManager"/>
</bean>
</beans>
所有聲明式事務方式(注解/XML)均依賴這五個參數:
| 常量 | 含義 | 典型場景 |
|---|---|---|
| REQUIRED | 支持當前事務,無則新建(默認) | 90% 業務方法 |
| SUPPORTS | 支持當前事務,無則非事務運行 | 只讀查詢、非關鍵輔助操作 |
| MANDATORY | 必須在事務中運行,無則拋異常 | 強制要求事務上下文的核心業務 |
| REQUIRES_NEW | 掛起當前事務,強制新建獨立事務 | 日誌、審計、通知等獨立副作用 |
| NOT_SUPPORTED | 非事務運行,掛起當前事務 | 長耗時非數據庫操作(文件、網絡) |
| NEVER | 非事務運行,有事務則拋異常 | 嚴禁事務上下文的純計算邏輯 |
| NESTED | 嵌套事務(保存點),僅 JDBC 支援 | 批量處理單條失敗回滾、分步驗證 |
| 隔離級別 | 常量 | 髒讀 | 不可重複讀 | 幻讀 | 性能 | 推薦場景 |
|---|---|---|---|---|---|---|
| DEFAULT | ISOLATION_DEFAULT | 依數據庫 | 依數據庫 | 依數據庫 | 依數據庫 | 無特殊要求時 |
| READ UNCOMMITTED | ISOLATION_READ_UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 | 最高 | 極低一致性要求、統計近似值 |
| READ COMMITTED | ISOLATION_READ_COMMITTED | ❌ 防止 | ✅ 可能 | ✅ 可能 | 高 | Oracle/PostgreSQL/SQL Server 默認、大多數業務 |
| REPEATABLE READ | ISOLATION_REPEATABLE_READ | ❌ 防止 | ❌ 防止 | ✅ 可能 | 中 | MySQL InnoDB 默認、需防止不可重複讀 |
| SERIALIZABLE | ISOLATION_SERIALIZABLE | ❌ 防止 | ❌ 防止 | ❌ 防止 | 最低 | 極高一致性、金融核心賬戶 |
並發三大異常:
TransactionTimedOutExceptioninnodb_lock_wait_timeout)@Transactional(rollbackFor = {BizException.class, SQLException.class})@Transactional(noRollbackFor = {ValidationException.class})TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()this.method() 繞過代理,需注入自身或拆分 ServiceSpring 事務管理雖抽象度高、用法簡單,但其背後涉及數據庫鎖機制、MVCC、連接池管理、AOP 代理鏈等深層技術棧。工程師應建立「事務邊界即業務邊界」的架構思維,在設計階段即明確每個服務方法的事務語義,而非事後補丁。