Spring 框架基於輕量級 IoC 容器,以卓越的資料存取與事務管理聞名。其聲明式事務可應用於任意 POJO,功能對標 EJB CMT。本文聚焦於 **事務掛起** 這一進階主題:為何標準 JTA UserTransaction 無法支援掛起、如何整合 JTA TransactionManager 實現 PROPAGATION_REQUIRES_NEW/NOT_SUPPORTED、以及 WebLogic 專用適配器如何釋放商業伺服器高階事務能力。
PetClinic 核心服務 Clinic 配置 (同 128902 文章):
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
<bean id="clinic" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionAttributes">
<props>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="store*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
目標服務 JdbcClinic 為純 POJO,透過 DataSource 執行 JDBC 操作,事務完全由代理層管理。
7 種傳播行為中,有兩種**需要掛起當前事務**:
其餘行為 (REQUIRED、SUPPORTS、MANDATORY、NEVER、NESTED) 均不涉及掛起邏輯。
| 介面 | 標準 JNDI 名稱 | 支援掛起/恢復 | 說明 |
|---|---|---|---|
| javax.transaction.UserTransaction | java:comp/UserTransaction (J2EE 規範) | ❌ 無 | 僅支援 begin/commit/rollback/setRollbackOnly |
| javax.transaction.TransactionManager | **廠商特定** (無標準 JNDI) | ✅ 有 | 提供 suspend()/resume(),實現掛起核心 |
結論:標準 JtaTransactionManager 預設查找 UserTransaction,**預設不支援事務掛起**。
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName"><value>vendorSpecificJndiLocation</value></property>
</bean>
Spring 將使用該 TransactionManager 實例執行 suspend()/resume(),從而支援上述兩種傳播行為。
TransactionManager 視為容器內部整合介面,非公開 API。WebLogic 官方 JNDI 名稱:javax.transaction.TransactionManager。配置此值即可在 WebLogic JTA 體系中實現事務掛起。
Spring 更提供專用適配器 org.springframework.transaction.jta.WebLogicJtaTransactionManager,除自動探測 TransactionManager 外,還解鎖三大獨家特性:
forceResume() 強制恢復繼續執行。
圖 2:WebLogic Server 事務監控主控台
| 類別 | 實現類 | 適用場景 |
|---|---|---|
| 本地事務 | DataSourceTransactionManager | 單一資料庫 (JDBC) |
| 本地事務 | HibernateTransactionManager | 單一資料庫 (Hibernate) |
| 全域事務 | JtaTransactionManager | 跨多資源 (J2EE 伺服器 JTA) |
| 全域事務 (擴展) | WebLogicJtaTransactionManager | WebLogic 專用高階特性 |
**核心價值**:應用代碼與聲明式事務完全解耦,僅需切換 Bean 定義即可在 Tomcat+單庫 ↔ WebLogic+多庫 間遷移,業務邏輯零修改。
Spring 事務管理提供全方位、非侵入式解決方案:
PlatformTransactionManager 抽象實現策略熱插拔。TransactionManager 整合支援 REQUIRES_NEW/NOT_SUPPORTED。