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

Spring 事務管理深度解析:從核心 API 到編程式與聲明式最佳實踐

     編輯:Java 相關知識

Spring 事務管理是企業級開發的基石。本文從核心抽象 PlatformTransactionManager、TransactionDefinition、TransactionStatus 切入,層層遞進剖析編程式(TransactionTemplate)與聲明式(AOP 攔截器、@Transactional、<tx> 命名空間)兩大範式,並給出多事務源場景下的架構建議。

核心三大抽象

介面職責典型實現
PlatformTransactionManager事務操作統一入口,委派到底層資源DataSourceTransactionManager、HibernateTransactionManager、JtaTransactionManager
TransactionDefinition事務屬性定義:傳播、隔離、超時、只讀DefaultTransactionDefinition
TransactionStatus運行時事務狀態:是否新事務、標記回滾DefaultTransactionStatus

關鍵洞見: PlatformTransactionManager 只是薄適配層,真正干活的是底層 Connection.commit() 或 Session.getTransaction().commit()。

編程式事務:從樣板代碼到模板回調

原始 API 風格(不推薦)

TransactionStatus status = txManager.getTransaction(def);
try {
    businessLogic();
    txManager.commit(status);
} catch (Exception e) {
    txManager.rollback(status);
    throw e;
}

TransactionTemplate 化繁為簡

transactionTemplate.execute(new TransactionCallback() {
    public Object doInTransaction(TransactionStatus status) {
        businessLogic(); // 異常自動回滾,正常自動提交
        return result;
    }
});

注意: 模板持有的 txManager 必須與業務代碼操作的資源(DataSource/SessionFactory)一致,否則事務不生效。

聲明式事務:AOP 的經典應用

演進脈絡

  1. TransactionInterceptor + ProxyFactoryBean:手工組裝,配置冗長。
  2. TransactionProxyFactoryBean:合二為一,仍需逐 Bean 配置。
  3. <tx:advice> + <aop:config>:切點表達式批量匹配,**推薦 XML 風格**。
  4. @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)。
  • 多資源需全局事務:必須用 JTA(JtaTransactionManager + 應用服務器/XA 驅動)。
  • 多資源無全局事務:各自管理,業務層自行協調補償,或引入 Seata 等柔性事務框架。

事務層級建議

事務邊界宜置於 Service 層(用例級別),DAO 單純操作持久化,避免事務嵌套導致傳播行為複雜化。

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