现在公司项目就要开始了, 用 struts2 hibernate spring 开发,.
已经确定使用2个sql server 数据库(sql 2005). 于是使用JTA, jotm 实现分布式事务.
我按照网上搜索的方式配置, 有两个数据源, 产生两个sessionFactory, 但却发现事务无法回滚!!!
看网上说sql 2005 要实现 XA, 需要增加几步操作, 要考一个文件到Binn目录下, 然后执行一个存储过程.
我试了一下, 还是不行.
这个是我测试项目的代码, 就实现一个最简单的插入数据, 也不知道究竟是项目问题还是数据库问题, 总之就是不能回滚~~~
哪位朋友有使用过的经验, 求教! 万分感谢!
以下是spring完整配置:
java 代码
- "1.0" encoding="UTF-8"?>
- "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans></beans>
- <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
- "HelloBean" class="com.powerapps.webservice.HelloImpl" />
- "jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
- "transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
- "userTransaction">"jotm"/>
- "dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
- "dataSource">
- class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
- "transactionManager">
- "jotm" />
- "driverName">
- <value></value>com.microsoft.sqlserver.jdbc.SQLServerDriver
- "url">
- <value></value>jdbc:sqlserver://192.168.1.63:1433;selectMethod=cursor;DatabaseName=eHR;
- "user">
- <value></value>mohr
- "password">
- <value></value>javadev
- "sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- "mappingResources">
- <list></list>
- <value></value>com/powerapps/model/base/Dictinfo.hbm.xml
- <value></value>com/powerapps/model/base/Subdictinfo.hbm.xml
- "dataSource">
- "dataSourceA" />
- "jtaTransactionManager">
- "jotm" />
- "hibernateProperties">
- <props></props>
- "hibernate.dialect">org.hibernate.dialect.SQLServerDialect
- "hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory
- "hibernate.show_sql">true
- "dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">
- "dataSource">
- class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">
- "transactionManager">
- "jotm" />
- "driverName">
- <value></value>com.microsoft.sqlserver.jdbc.SQLServerDriver
- "url">
- <value></value>jdbc:sqlserver://192.168.1.63:1433;selectMethod=cursor;DatabaseName=test;
- "user">
- <value></value>mohr
- "password">
- <value></value>javadev
- "sessionFactoryB" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- "mappingResources">
- <list></list>
- <value></value>com/powerapps/model/base/Positioninfo.hbm.xml
- "dataSource">
- "dataSourceB" />
- "jtaTransactionManager">
- "jotm" />
- "hibernateProperties">
- <props></props>
- "hibernate.dialect">org.hibernate.dialect.SQLServerDialect
- "hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory
- "hibernate.show_sql">true
- "daoB" class="com.powerapps.dao.base.impl.DaoImplB">
- "sessionFactory">
- "sessionFactoryB" />
- "txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- "transactionManager">
- "transactionManager"/>
- "transactionAttributes">
- <props></props>
- "get*">PROPAGATION_REQUIRED
- "*">PROPAGATION_REQUIRED
- "dictProxy" parent="txProxyTemplate" >
- "target">
- class="com.powerapps.service.admin.base.impl.DictManagerImpl">
- "sessionFactory">"sessionFactory" />
- "daoB">"daoB" />
- "positionProxy" parent="txProxyTemplate" >
- "target">
- class="com.powerapps.service.admin.base.impl.PositionManagerImpl">
- "sessionFactory">"sessionFactoryB" />
- "DictAction" class="com.powerapps.action.admin.base.DictAction" singleton="false" autowire="byName">
- "SubDictAction" class="com.powerapps.action.admin.base.SubDictAction" singleton="false" autowire="byName">
以下是在struts action中代码:
java 代码
- public String test()
- {
- dictProxy.testJta();
- return "DictSearchPage";
- }
以下是中间层的代码: 中间曾继承了一个 BaseManagerImpl, 而 BaseManagerImpl 又继承了 BaseDaoImpl
save方法就是 BaseDaoImpl 中实现的. 以下代码中头两条记录都插入进分别的库了, 应该是回滚才对!
java 代码
- public void testJta()
- {
- try
- {
- Dictinfo aDictinfo = new Dictinfo();
- aDictinfo.setName("111");
- super.saveObject(aDictinfo);
- //数据库1 继承过来 BaseDaoImpl 的sessionsessionFactory
- Positioninfo position = new Positioninfo();
- position.setName("111");
- daoB.saveObject(position);
- //数据库2 daoB中的sessionsessionFactory
- Dictinfo dictinfo = new Dictinfo();
- super.saveObject(dictinfo);
- //Name字段不能为空, 出错拉, 应该把之前的插入都回滚
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }