我正在使用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都链接到sessionFactory1
或sessionFactory2
。
<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>