2013-10-03 48 views
2

我們使用Spring與Hibernate建立與JTA的事務。 PlatformTransactionManager是與來自narayana的TransactionManager和UserTransaction連接的JtaTransactionManager。來自Spring或JNDI的TransactionManager? (JBOSS + Spring 3 + Hibernate 4 + JTA)

@Bean 
@Scope("prototype") 
public TransactionManager jbossTransactionManager() { 
    return jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager(); 
} 

@Bean 
@Scope("prototype") 
public UserTransaction jbossUserTransaction() { 
    return jtaPropertyManager.getJTAEnvironmentBean().getUserTransaction(); 
} 

@Bean 
public PlatformTransactionManager transactionManager() { 
    return new JtaTransactionManager(jbossUserTransaction(), jbossTransactionManager()); 
} 

我注意到JtaTransactionManager有我想要的UT和TM。在JBoss 6 EAP上,我注意到我的DataSource已被用作WrapperDataSource,並且這與一個不同的TM有關。具體來說,它使用的是TransactionManagerDelegate。這似乎是JBoss通過JNDI名稱java:TransactionManagerjava:jboss/TransactionManager提供的事務管理器。這阻止了我的交易具有交易邊界,並且我泄露了有關交易的數據。如果我從容器中刪除配置以及UT和TM,我的事務處理正常。

  1. 什麼決定使用這個其他的TransactionManager?這似乎是來自容器的JCA,但我不明白這個決定的機制。
  2. 我是否應該刪除我的UT和TM並將控制權交還給 容器,以便將這些組件提供給我的應用程序並依靠JTA 平臺,或者我應該嘗試獲得更多控制權?
+0

'這阻止了我的交易具有交易邊界,並且我泄露了有關沖洗的數據。'請詳細解釋此問題。很難理解它的含義。 – ben75

+0

我可以看到Hibernate認爲它是在一個事務中。因此,它執行自動刷新,期望物理事務將數據保留在數據庫之外。具體來說,我可以在Hibernate中調試到'ActionQueue#executeActions',並且看到數據在'executeActions(insertions);'之前沒有被提交,並且之後它在數據庫中。 (由不同的程序通過手動查詢數據庫來驗證)我開始相信JBoss的JCA決定使用這個其他的TransactionManager而不是我的Spring bean版本,但我還沒有完全理解這一點。 – user2832162

回答

0

容器爲數據源提供來自JCA的事務管理器。這個TransactionManager是一個不同於我們從Spring連線的實例。 (我們的bean已經從arjuna環境bean實例化了)。使用Spring的JtaManager從容器中通過默認位置的JNDI獲取事務管理器,以確保我們在Hibernate使用的JTA平臺(本例中爲JBoss App Server)中具有相同的事務管理器。

在我們進行此更改之前,應用程序TransactionManager與Hibernate處於事務中,但數據源上的transactionManager未參與導致「泄漏」。

使用相同的實例將所有內容協同工作。 WebLogic使用相同的方法也證明了這一點。

相關問題