我們使用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:TransactionManager
和java:jboss/TransactionManager
提供的事務管理器。這阻止了我的交易具有交易邊界,並且我泄露了有關交易的數據。如果我從容器中刪除配置以及UT和TM,我的事務處理正常。
- 什麼決定使用這個其他的TransactionManager?這似乎是來自容器的JCA,但我不明白這個決定的機制。
- 我是否應該刪除我的UT和TM並將控制權交還給 容器,以便將這些組件提供給我的應用程序並依靠JTA 平臺,或者我應該嘗試獲得更多控制權?
'這阻止了我的交易具有交易邊界,並且我泄露了有關沖洗的數據。'請詳細解釋此問題。很難理解它的含義。 – ben75
我可以看到Hibernate認爲它是在一個事務中。因此,它執行自動刷新,期望物理事務將數據保留在數據庫之外。具體來說,我可以在Hibernate中調試到'ActionQueue#executeActions',並且看到數據在'executeActions(insertions);'之前沒有被提交,並且之後它在數據庫中。 (由不同的程序通過手動查詢數據庫來驗證)我開始相信JBoss的JCA決定使用這個其他的TransactionManager而不是我的Spring bean版本,但我還沒有完全理解這一點。 – user2832162