Atomikos / Spring - 两个DB的全局事务

时间:2014-01-17 07:52:53

标签: java sql-server spring transactions jta

我正在使用Spring并尝试设置全局事务 跨越两个MS SQL Server数据库。该应用正在运行 在Tomcat 6中。

我有这些定义。

<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>

然后,每个DAO都链接到sessionFactory1sessionFactory2

<bean name="stateHibernateDao" class="com.project.dao.StateHibernateDao">
      <property name="sessionFactory" ref="sessionFactory1"/>
</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> 

我正在尝试以编程方式管理全局事务 (这是一些旧的遗留代码,我也不想改变它 所以我更喜欢以编程方式管理这个。)

好的,现在我有了这个UserTransaction ut(从Spring注入),所以 我打电话给ut.begin(),通过DAO对两个DB做一些DB / DAO操作, 然后我打电话给ut.commit()

问题是即使在ut.commit()调用之前,我也可以看到数据已经提交给数据库了?!

1)我不认为Atomikos知道我的两个数据库,他们的数据源,会话工厂等。我不认为它会开始任何交易。看起来他们在全球交易中根本没有入伍。

2)对我来说,似乎每个DB / DAO操作都自己进入SQL Server, 所以SQL Server只为那个DAO / DB操作创建一个隐式事务, 应用操作并提交隐式事务。

但是1)和2)只是我的猜测。

我的问题:

我是否需要自己启动两个数据库事务(但是好的,
这就是我目前正在做的事情,我正试图摆脱;
这就是我尝试使用Atomikos开始的原因)?

如何正确配置所有这些,以便
当我致电ut.begin()时,它开始全局交易 两个DB,当我调用它ut.commit()时,它会提交它吗?

我最近没有和JTA玩过,所以在我看来 我遗漏了一些非常基本的东西。它是什么?

非常感谢任何帮助。 很抱歉,文字很长。

编辑1:

<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>

0 个答案:

没有答案