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

Spring 事務管理實戰:聲明式事務、傳播行為與註解/XML 配置詳解

     編輯:Java 綜合教學

前置知識

事務基礎(ACID、隔離級別)請參考:Java 基礎——事務

一、Spring 事務管理核心:PlatformTransactionManager

Spring 以 Bean 形式聲明事務管理器,常用實現:

  • DataSourceTransactionManager:JDBC / MyBatis 單數據源
  • HibernateTransactionManager:Hibernate
  • JtaTransactionManager:分布式事務 (JTA)
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="${jdbc.DriverClass}"/>
  <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
  <property name="user" value="${jdbc.user}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

二、XML 聲明式事務 (AOP)

  1. 引入 tx Schema
  2. 定義事務增強 <tx:advice id="txAdvice" transaction-manager="transactionManager"/>
  3. 配置切點與織入
    <aop:config>
      <aop:pointcut id="bookPointcut" expression="execution(* *.BookServiceImpl.*(..))"/>
      <aop:advisor advice-ref="txAdvice" pointcut-ref="bookPointcut"/>
    </aop:config>

注意:只有 public 方法可被增強。

三、註解聲明式事務 (@Transactional)

  1. 啟用註解驅動:<tx:annotation-driven transaction-manager="transactionManager"/>(若 Bean 名為 transactionManager 可省略屬性)
  2. 在類或 public 方法上加 @Transactional
@Service
public class BookServiceImpl {
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void shop() { ... }
}

四、事務傳播行為(Propagation)

Spring 在 JDBC 隔離級別基礎上擴展了 7 種傳播行為:

常數行為描述
REQUIRED有事務則加入,無則新建(預設)
REQUIRES_NEW掛起現有事務,強制新建獨立事務
NESTED嵌套事務(savepoint),外層回滾則內層回滾,內層回滾不影響外層
SUPPORTS有事務則加入,無則以非事務執行
NOT_SUPPORTED掛起現有事務,以非事務執行
NEVER必須非事務執行,若有事務拋異常
MANDATORY必須在現有事務中執行,否則拋異常

通俗理解:REQUIRED vs REQUIRES_NEW

方法 A 調用方法 B:

  • REQUIRED:A、B 共用同一事務(一起提交/回滾)
  • REQUIRES_NEW:B 開啟獨立事務,A 失敗不影響 B,B 失敗不影響 A(視配置)

五、事務進階屬性

  • timeout:超時秒數,超時自動回滾
  • readOnly:只讀優化(提示資料庫)
  • rollbackFor / noRollbackFor:指定觸發/不觸發回滾的異常類(預設僅 RuntimeException & Error 回滾)

XML 中同樣可配置:

<tx:advice id="bookAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="shop" propagation="REQUIRED" timeout="30" read-only="false" rollback-for="java.lang.Exception"/>
  </tx:attributes>
</tx:advice>

最佳實踐建議

  1. 優先使用 @Transactional,配置集中、可讀性高。
  2. 業務邊界方法加註解;私有/非 public 方法無效。
  3. 明確指定 rollbackFor = Exception.class,避免檢查型異常不回滾。
  4. 長事務設置 timeout 防止資源佔用過久。
  5. 讀多寫少場景善用 readOnly=true。

掌握 Spring 事務管理,能從容應對複雜業務的一致性挑戰。

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