锁定老帖子 主题:JTA不能回滚的问题!
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-21
现在公司项目就要开始了, 用 struts2 hibernate spring 开发,. 已经确定使用2个sql server 数据库(sql 2005). 于是使用JTA, jotm 实现分布式事务. 我按照网上搜索的方式配置, 有两个数据源, 产生两个sessionFactory, 但却发现事务无法回滚!!! 看网上说sql 2005 要实现 XA, 需要增加几步操作, 要考一个文件到Binn目录下, 然后执行一个存储过程. 我试了一下, 还是不行. 这个是我测试项目的代码, 就实现一个最简单的插入数据, 也不知道究竟是项目问题还是数据库问题, 总之就是不能回滚~~~ 哪位朋友有使用过的经验, 求教! 万分感谢! 以下是spring完整配置: java 代码
以下是在struts action中代码: java 代码
以下是中间层的代码: 中间曾继承了一个 BaseManagerImpl, 而 BaseManagerImpl 又继承了 BaseDaoImpl save方法就是 BaseDaoImpl 中实现的. 以下代码中头两条记录都插入进分别的库了, 应该是回滚才对! java 代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-09-24
关注中,希望有经验得朋友能够给个思路
|
|
返回顶楼 | |
发表时间:2007-09-24
以下是中间层的代码: 中间曾继承了一个 BaseManagerImpl, 而 BaseManagerImpl 又继承了 BaseDaoImpl
save方法就是 BaseDaoImpl 中实现的. 以下代码中头两条记录都插入进分别的库了, 应该是回滚才对! java 代码
这个testJta方法配了事务了么? |
|
返回顶楼 | |
发表时间:2007-09-24
多谢上面两位关注!
回 daquan198163: 配事务了, testJta方法是 dictProxy 中的方法. <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="dictProxy" parent="txProxyTemplate" > <property name="target"> <bean class="com.powerapps.service.admin.base.impl.DictManagerImpl"> <property name="sessionFactory"><ref bean="sessionFactory" /></property> <property name="daoB"><ref bean="daoB" /></property> </bean> </property> </bean> |
|
返回顶楼 | |
发表时间:2007-09-24
问题出在这里:
# catch(Exception e) # { # e.printStackTrace(); # } 建议补习一下Spring基础 |
|
返回顶楼 | |
发表时间:2007-09-24
to daquan198163:
不明白你的意思, 我这个异常捕捉纯粹是为了在控制台看异常情况, 没有其他任何作用的. (我这个只是测试项目, 只是为了测试分布事务) |
|
返回顶楼 | |
发表时间:2007-09-24
不抛异常spring不会回滚事务的
|
|
返回顶楼 | |
发表时间:2007-09-24
谢谢 daquan198163 回答, 我testJta把代码改为:
catch(Exception e) { throw new RuntimeException(); } 仍然不行啊... 顺便说句, 我以前单数据源作的时候都没有抛异常的, 却回滚了... 抛不抛异常是必要条件吗? |
|
返回顶楼 | |
发表时间:2007-09-24
如果这样还不行,只能怀疑SqlServer的问题了
抛异常是必要条件 |
|
返回顶楼 | |
发表时间:2007-09-26
首先非常感谢daquan198163的回答, 终于可以回滚了, 但是在oracle10g下, sql2005下仍然不行. (正在处理中...有经验的朋友请指教啊!!!)
看来程序没有问题, 是数据库没有配好的原因(sql对j2ee支持真是垃圾, oracle什么都不用配). 现在还有几个问题: 1 我的程序没有抛异常(throw new RuntimeException()),但确实是回滚了. 这点和文档与书上说的有点出入, 不知是怎么回事? (以前作单数据源时根本没有在意这件事, 测试一下可以回滚就没有理了) 不过这个是小问题! 2 这个是关于Session的使用. 记得robbin曾经总结说: 使用JTA时是先启动事务, 在这个全局事务范围内会启动多个session, 而hibernate则先打开session再启动事务, 顺序正好相反. 我试了试OpenSessionInView模式, 可以正常使用. 这样是不是说像 Session session = getSession() session.方法(...) 这样的代码就只能用于读数据,写数据就有问题了? 目前还没试过. 3 我问了一个朋友, 他有很多年经验了. 说JTA事务是比较占资源的, 并且jotm的bug比较多, 使用它们的话不合算, 干脆就不用分布事务. 我想请教一下各位大牛关于这些的看法. |
|
返回顶楼 | |