最近对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进行配置不会产生此问题。