Spring 事務管理是企業級開發的基石。本文從核心抽象 PlatformTransactionManager、TransactionDefinition、TransactionStatus 切入,層層遞進剖析編程式(TransactionTemplate)與聲明式(AOP 攔截器、@Transactional、<tx> 命名空間)兩大範式,並給出多事務源場景下的架構建議。
| 介面 | 職責 | 典型實現 |
|---|---|---|
PlatformTransactionManager | 事務操作統一入口,委派到底層資源 | DataSourceTransactionManager、HibernateTransactionManager、JtaTransactionManager |
TransactionDefinition | 事務屬性定義:傳播、隔離、超時、只讀 | DefaultTransactionDefinition |
TransactionStatus | 運行時事務狀態:是否新事務、標記回滾 | DefaultTransactionStatus |
關鍵洞見: PlatformTransactionManager 只是薄適配層,真正干活的是底層 Connection.commit() 或 Session.getTransaction().commit()。
TransactionStatus status = txManager.getTransaction(def);
try {
businessLogic();
txManager.commit(status);
} catch (Exception e) {
txManager.rollback(status);
throw e;
}
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
businessLogic(); // 異常自動回滾,正常自動提交
return result;
}
});
注意: 模板持有的 txManager 必須與業務代碼操作的資源(DataSource/SessionFactory)一致,否則事務不生效。
TransactionInterceptor + ProxyFactoryBean:手工組裝,配置冗長。TransactionProxyFactoryBean:合二為一,仍需逐 Bean 配置。<tx:advice> + <aop:config>:切點表達式批量匹配,**推薦 XML 風格**。@Transactional:零配置,註解標注,**推薦註解風格**。<tx:annotation-driven transaction-manager="transactionManager"/>
@Service
public class OrderService {
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void placeOrder(Order order) { ... }
}
避坑指南:
public 方法生效(AOP 代理限制)。RuntimeException 觸發回滾,檢查異常需顯式 rollbackFor。PlatformTransactionManager(JDBC/Hibernate/JPA)。JtaTransactionManager + 應用服務器/XA 驅動)。事務邊界宜置於 Service 層(用例級別),DAO 單純操作持久化,避免事務嵌套導致傳播行為複雜化。