Java Atomikos/Spring-两个数据库上的全局事务

Java Atomikos/Spring-两个数据库上的全局事务,java,sql-server,spring,transactions,jta,Java,Sql Server,Spring,Transactions,Jta,我正在使用Spring并尝试设置一个全局事务 跨越两个MS SQL Server数据库。应用程序正在运行 在Tomcat6里面 我有这些定义 <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> .... </bean> <bean id="sessionFactory1" class="org.springframe

我正在使用Spring并尝试设置一个全局事务 跨越两个MS SQL Server数据库。应用程序正在运行 在Tomcat6里面

我有这些定义

<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
....
</bean>

<bean id="sessionFactory1"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource1"/>
....
</bean>

<bean id="hibernateTransactionManager1"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory1"/>
    </property>
</bean>


<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
....
</bean>

<bean id="sessionFactory2"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource2"/>
....
</bean>

<bean id="hibernateTransactionManager2"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory2"/>
    </property>
</bean>
另外,我最近添加了这两个

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> 
        <property name="forceShutdown" value="false" />
        <property name="transactionTimeout" value="300" />
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
   <property name="transactionTimeout" value="300" /> 
</bean> 

your配置缺少XA数据源,并且您没有JtaTransactionManager来管理事务—您仍然有HibernateTransactionManager。接下来,您似乎错过了JTA的正确休眠设置。我建议您阅读Atomikos的文档。@M.Deinum谢谢您的留言。你能告诉我一些更具体的东西,特别是关于XA数据源的吗?我让JtaTransactionManager在某个时候进来了。我会再试一次。两个HibernateTransactionManager已定义,但当前未使用。我是否需要在JtaTransactionManager或Atomikos impl TM上调用begin and commit?JTA将只与支持它的数据源一起工作,目前您只有非xa数据源。如前所述,您似乎也没有为JTA和Atomikos正确配置hibernate。如果我没记错的话,atomikos为数据源提供了xa包装。@M.Deinum再次感谢。即使使用JtaTransactionManager,它也不起作用(我的意思是我看到了相同的行为)。我在该管理器上调用getUserTransaction,然后在UserTransaction上调用begin/commit/rollback。还是不走运。我读到,即使是非XA数据源也可以参与全局事务,但设置似乎比这更复杂,或者我仍然缺少一些基本的东西。请参阅“编辑1”。您可以让一个非xa资源参与全局事务,而不是多个事务。如前所述,如果设置不正确(数据源、hibernate),它将无法工作。你不能仅仅把一个
UserTransactionManager
等放在那里,期望它能工作。
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> 
        <property name="forceShutdown" value="false" />
        <property name="transactionTimeout" value="300" />
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
   <property name="transactionTimeout" value="300" /> 
</bean> 
<bean id="globalTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="userTransaction" ref="atomikosUserTransaction"/>
    <property name="transactionManager" ref="atomikosTransactionManager" />
    <property name="allowCustomIsolationLevels" value="true" />
    <property name="transactionSynchronization" value="2" />
</bean>