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

Spring 事務管理五種配置方式全解析:從 XML 到全注解演進

     編輯:Java 相關知識

核心三要素:任何配置方式的不變基石

Spring 聲明式事務無論採用哪種代理機制,核心始終包含三個 Bean:

  1. DataSource / SessionFactory:數據源或 Hibernate SessionFactory
  2. TransactionManager:平台事務管理器(DataSourceTransactionManager、HibernateTransactionManager、JtaTransactionManager)
  3. 代理機制:如何將事務邏輯織入目標 Bean(五種方式的核心差異點)

方式一:每個 Bean 獨立代理(TransactionProxyFactoryBean)

適用:早期 Spring 1.x/2.x,少量 Bean 需事務

<bean id="userDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="target" ref="userDaoTarget"/>
    <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao"/>
    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

缺點:配置冗長,每個目標 Bean 需額外定義一個代理 Bean。

方式二:共享父 Bean 定義(抽象代理基類)

優化:提取公共事務屬性到父 Bean,子 Bean 繼承

<bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
      abstract="true" lazy-init="true">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
        <props><prop key="*">PROPAGATION_REQUIRED</prop></props>
    </property>
</bean>

<bean id="userDao" parent="transactionBase">
    <property name="target" ref="userDaoTarget"/>
</bean>

方式三:攔截器 + 自動代理創建器

核心:定義 TransactionInterceptor,配合 BeanNameAutoProxyCreator 批量代理

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
        <props><prop key="*">PROPAGATION_REQUIRED</prop></props>
    </property>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames"><list><value>*Dao</value></list></property>
    <property name="interceptorNames"><list><value>transactionInterceptor</value></list></property>
</bean>

優勢:零侵入業務 Bean,通過命名規則(如 *Dao)批量應用事務。

方式四:<tx:advice> + <aop:config>(Schema 風格,Spring 2.0+ 推薦)

特點:聲明式切點表達式,關注點分離更徹底

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="daoPointcut" expression="execution(* com.bluesky.spring.dao.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="daoPointcut"/>
</aop:config>

方式五:全注解驅動(@Transactional,Spring 2.5+ 主流標準)

配置極簡:僅需啟用注解驅動

<tx:annotation-driven transaction-manager="transactionManager"/>
<context:component-scan base-package="com.bluesky"/>

業務代碼:在類或方法上標註 @Transactional

@Repository
@Transactional  // 類級別:所有 public 方法開啟事務
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    public List<User> listUsers() {
        return getSession().createQuery("from User").list();
    }
}

五種方式對比選型指南

維度方式一方式二方式三方式四方式五
配置複雜度高中中低極低
維護性差一般好優最佳
靈活性(方法級控制)高高中高最高
推薦場景歷史項目維護早期項目遷移批量同類 Bean新項目 XML 風格現代 Spring 項目

事務屬性關鍵知識點

  • 傳播行為:REQUIRED(默認,支持當前事務)、REQUIRES_NEW(掛起當前、新建)、NESTED(嵌套保存點)
  • 隔離級別:READ_COMMITTED(默認)、REPEATABLE_READ、SERIALIZABLE
  • 只讀優化:readOnly=true 針對查詢方法,提示數據庫/持久層優化
  • 回滾規則:默認僅 RuntimeException/Error 觸發回滾,rollbackFor=Exception.class 可擴展
  • 超時:timeout=30 秒,防止長事務佔用資源

總結

從繁瑣的 TransactionProxyFactoryBean 到優雅的 @Transactional,Spring 事務配置經歷了「配置外部化 → 切點表達式 → 註解驅動」的演進。新項目首選方式五(全注解),配合 @Transactional(readOnly=true) 細粒度控制,代碼意圖清晰、維護成本最低。僅在需動態切換事務策略、非 Spring 容器管理 Bean 等特殊場景考慮方式三/四。

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