最近对EJB分布式事务进行了一些接触,在操作过程中遇到一个问题,就是不能完全保证事务的完整性,偶尔会有小几率的失败,通过上网查找,发现国内关于这个问题的资料还是很少,所以现在把它记录下来,以备参考:
遇到警告:
WARN [TxConnectionManager$LocalXAResource] Prepare called on a local tx. Use of local transactions on a jta transaction with more than one branch may result in inconsistent data in some cases of failure.
发生场景:
在JBoss中,用Session Bean进行容器事务管理,若一个事务方法中操作多个数据库,而对这些数据库的数据源配置是local-tx-datasource,就会产生这样的警告(在应用局部/本地事务进行jta事务管理中,若设计多个数据库流程,在某些情况下会产生一致性失败)。
问题及解决:
出现上述失败及警告的原因是配置数据源类型错误,正确的配置是在JBoss中进行分布式的数据源配置,文件为mssql-xa-ds.xml,配置内容如下
<datasources>
<xa-datasource>
<jndi-name>JSQLConnectDB_Test_locale</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">192.168.11.185</xa-datasource-property>
<xa-datasource-property name="DatabaseName">qinysong</xa-datasource-property>
<user-name>sa</user-name>
<password>123456</password>
</xa-datasource>
<xa-datasource>
<jndi-name>JSQLConnectDB_Test_Remote</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">192.168.8.92</xa-datasource-property>
<xa-datasource-property name="DatabaseName">qinysong</xa-datasource-property>
<user-name>sa</user-name>
<password>xmission</password>
</xa-datasource>
</datasources>
<xa-datasource>
<jndi-name>JSQLConnectDB_Test_locale</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">192.168.11.185</xa-datasource-property>
<xa-datasource-property name="DatabaseName">qinysong</xa-datasource-property>
<user-name>sa</user-name>
<password>123456</password>
</xa-datasource>
<xa-datasource>
<jndi-name>JSQLConnectDB_Test_Remote</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">192.168.8.92</xa-datasource-property>
<xa-datasource-property name="DatabaseName">qinysong</xa-datasource-property>
<user-name>sa</user-name>
<password>xmission</password>
</xa-datasource>
</datasources>
备注:若EJB事务方法中只是对一个数据源进行多个步骤的操作,而不是对于多个数据源,则用local-tx-datasource进行配置不会产生此问题。
2526

被折叠的 条评论
为什么被折叠?



