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

Spring 事務管理深度解析:編程式與聲明式事務的實戰對比

     編輯:Java 相關知識

Spring 框架核心三支柱

  • IoC/DI:控制反轉,容器管理對象生命週期與依賴
  • AOP:面向切面編程,聲明式使用企業級服務(安全、事務)
  • 服務抽象:統一 J2EE API 使用介面,減少代碼、降低 Bug

三者結合構成輕量級 J2EE 解決方案。

Spring 事務管理兩大類型

類型特點
編程式靈活但代碼量大、重複代碼多
聲明式更靈活方便,推薦使用

傳統 JDBC 事務管理痛點

Connection conn = null;
try {
    conn = DBConnectionFactory.getConnection();
    conn.setAutoCommit(false);
    // do something
    conn.commit();
} catch (Exception e) {
    conn.rollback();
} finally {
    // 複雜的資源關閉邏輯,易疏漏拋出異常
}

代碼冗長、易遺漏 try/catch、資源關閉易出錯。

Spring 編程式事務管理

核心介面

  • PlatformTransactionManager:事務管理基礎介面
  • TransactionDefinition:事務屬性定義
  • TransactionStatus:當前事務狀態,可提交/回滾

手動控制範例

TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try {
    // do sth
    transactionManager.commit(ts);
} catch (Exception e) {
    transactionManager.rollback(ts);
}

使用 TransactionTemplate 簡化

void add() {
    transactionTemplate.execute(new TransactionCallback() {
        public Object doInTransaction(TransactionStatus ts) {
            // do sth
            return null;
        }
    });
}

需注入事務管理器。Template 封裝了提交/回滾邏輯。

Spring 聲明式事務管理(核心推薦)

基於 IoC + AOP,提供 TransactionInterceptor 與 TransactionProxyFactoryBean。

方案一:TransactionInterceptor + ProxyFactoryBean

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager"><ref bean="transactionManager"/></property>
    <property name="transactionAttributeSource">
        <value>com.test.UserManager.*=PROPAGATION_REQUIRED</value>
    </property>
</bean>

<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces"><value>com.test.UserManager</value></property>
    <property name="interceptorNames">
        <list><idref local="transactionInterceptor"/></list>
    </property>
</bean>

方案二:TransactionProxyFactoryBean(更簡潔)

<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref bean="transactionManager"/></property>
    <property name="target"><ref local="userManagerTarget"/></property>
    <property name="transactionAttributes">
        <props>
            <prop key="insert*">PROPAGATION_REQUIRED</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
    </property>
</bean>

方法名模式匹配定義事務屬性,支援傳播行為、只讀等屬性。

進階:多攔截器組合

若需業務驗證等非事務切面,可結合 TransactionTemplate + 多攔截器。Spring AOP 提供三類 Advice:前置、後置、拋出異常增強。

結語

  • Spring 讓普通 Java 類輕鬆納入事務管理
  • 聲明式事務不再是 EJB 專利,避免 EJB 種種不便
  • 提供唯一事務管理抽象,統一 JDBC/JTA 等底層技術的編程模型
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved