请教关于spring事务配置的问题配置文件如下:bean idproductManagerTarget autowirebyTypepropert
请教关于spring事务配置的问题
配置文件如下:
<bean id="productManagerTarget" autowire="byType">
<property name="productDao">
<ref bean="productDao" />
</property>
</bean>
<bean id="productService" />
</property>
<property name="target">
<ref local="productManagerTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- ProdScopeService -->
<bean id="prodScopeManagerTarget" autowire="byType">
<property name="prodScopeDao">
<ref bean="prodScopeDao" />
</property>
</bean>
<bean id="prodScopeService" />
</property>
<property name="target">
<ref local="prodScopeManagerTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
以上是两个service配置,在程序中分别是两个service接口,
然后用两个manager类来实现接口中定义的方法,
现在我想在其中一个manager的save方法中去调另一个service接口的save方法,
使它们之间形成一个事务,一个失败另一个回滚,
但测试的结果是,里面包含的service方法,未回滚成功,
请教各位高手,该如何解决?Criteria c = getSession().createCriteria(User.class);c.save(user);getSession().flush();throw new Exception();
把这段代码放到事务体中,如果这段代码执行完毕后数据库中有数据则证明回滚没有成功
第四行改成throw new RuntimeException();试了吗?
ps:你用的是hibernate吗?我的Criteria没有.save方法
Criteria c = createCriteria(User.class);.save(user);getSession().flush();throw new Exception();
把这段代码放到事务体中,如果这段代码执行完毕后数据库中有数据则证明回滚没有成功
第四行改成throw new RuntimeException();试了吗?
ps:你用的是hibernate吗?我的Criteria没有.save方法
不好意思,糊涂了,随手写的
getSession().save(user);getSession().flush();throw new Exception();
53 楼 ahuaxuan 2007-03-21 lvping 写道session = getHibernateTemplate().getSessionFactory().openSession();
session.save(basevo);
session.flush();
我做了一个测试,结果是这样的,我这两个方法都是调用基类里的save方法,如果把session.flush();注释掉,数据库里两个表都存不进记录,把这句话放开,就不能回滚.
因为我是很早之前做的测试,代码找捕着了,lz是怎么测试的,楼主的代码能否放出来大家看看 54 楼 ahuaxuan 2007-03-21 jamesby 写道把throw new Exception();
改成session.rollback测试一下,个人建议。
看看这个贴,他就是这么做得,还是有数据进了数据库
http://www.iteye.com/topic/5140 55 楼 ahuaxuan 2007-03-21 daquan198163 写道ahuaxuan 写道jamesby 写道把throw new Exception();
改成session.rollback测试一下,个人建议。
如果在事务体之中,那么抛出异常事务会回滚的
Spring事务管理器和EJB容器在默认情况下只对RuntimeException起作用
建议再补补应用服务器事务管理的基本常识
你说得对,我把without ejb翻了一下,p244,第6行,注意到了这个细节,只有运行时异常才会导致回滚,或者自己指定回滚规则,但是你看看这个连接,他是手动回滚的
http://www.iteye.com/topic/5140还望指教
PS:我说你对threadlocal的理解有误,你说我和你抬扛, 而我对这个容器事务管理的异常问题理解有误,你叫我回去补补基本常识,讨论问题时能不能不要拿出这种高高在上的架势出来呀,我听说高手都是很虚心,很谦让,很乐于助人的 56 楼 dada 2007-03-21 ahuaxuan 写道
因为我是很早之前做的测试,代码找捕着了,lz是怎么测试的,楼主的代码能否放出来大家看看
你现在能重现这个错误吗? 57 楼 ahuaxuan 2007-03-21 dada 写道ahuaxuan 写道
因为我是很早之前做的测试,代码找捕着了,lz是怎么测试的,楼主的代码能否放出来大家看看
你现在能重现这个错误吗?我说了,这个只是测试,我当时只不过有这个想法,然后就去测试了,楼主昨天的测试也是同样的结果,你看看上面这个连接吧http://www.iteye.com/topic/5140这个连接中是手动rollback,还是同样的结果,那个时候他用的应该是hibernate2.x的 58 楼 daquan198163 2007-03-21 我觉得可能的原因有两个:
1、回滚的不是同一个session
2、connection 的auto_commit设为true了
其实这些繁琐的问题都可以通过Spring的HibernateTemplate屏蔽掉 59 楼 dada 2007-03-21 ahuaxuan 写道dada 写道ahuaxuan 写道
因为我是很早之前做的测试,代码找捕着了,lz是怎么测试的,楼主的代码能否放出来大家看看
你现在能重现这个错误吗?我说了,这个只是测试,我当时只不过有这个想法,然后就去测试了,楼主昨天的测试也是同样的结果,你看看上面这个连接吧http://www.iteye.com/topic/5140这个连接中是手动rollback,还是同样的结果,那个时候他用的应该是hibernate2.x的
楼主的问题和你的问题不是一个问题啊,他出错的原因他自己不是已经在第二页阐明了吗?
其实你给的那个帖子说的也太含糊了,少了关键代码,如果你能够重现错误当然最好咯,我的测试从来没有遇到过这种问题。
60 楼 ahuaxuan 2007-03-21 楼主虽然问的问题不一样,但是关于这个问题她做过测试,在第一页,你看了吗
引用session = getHibernateTemplate().getSessionFactory().openSession();
session.save(basevo);
session.flush();
我做了一个测试,结果是这样的,我这两个方法都是调用基类里的save方法,如果把session.flush();注释掉,数据库里两个表都存不进记录,把这句话放开,就不能回滚.
但是我现在怀疑她也是抛出了Exception,没有抛RuntimeException,data兄,你能把你的测试代码贴出来吗 61 楼 dada 2007-03-21 ahuaxuan 写道楼主虽然问的问题不一样,但是关于这个问题她做过测试,在第一页,你看了吗
引用session = getHibernateTemplate().getSessionFactory().openSession();
session.save(basevo);
session.flush();
我做了一个测试,结果是这样的,我这两个方法都是调用基类里的save方法,如果把session.flush();注释掉,数据库里两个表都存不进记录,把这句话放开,就不能回滚.
但是我现在怀疑她也是抛出了Exception,没有抛RuntimeException,data兄,你能把你的测试代码贴出来吗
lz的这个测试session脱离了spring的hibernateTemplate的管理,别期望由spring管理的事务有效。
和你说的应该不是一个意思吧? 62 楼 ahuaxuan 2007-03-21 引用把这句话放开,就不能回滚.我只注意到这一句,
没有仔细想这一句引用注释掉,数据库里两个表都存不进记录
这样看来,没错,她并没有把这个测试代码放到事务体之中,所以注释掉数据库存不进记录。
我晚上回去再做一个测试,等晚上给大家一个交代,呵呵 63 楼 ahuaxuan 2007-03-21 我测试过了,确实是只有抛出RuntimeException确实可以回滚,我找到之前的代码,之前测的时候是抛出了SQLException,SQLException是直接继承Exception。
谢谢daquan198163和dada。虽然如此,我认为这个贴还是一个好贴,因为之前贴的很多东西都蛮有价值的 64 楼 daquan198163 2007-03-21 是的,这次讨论过程中google了很多hibernate的资料,很有收获地:) 65 楼 jamesby 2007-03-22 收获不小,对以后使用Hibernate有很大帮助。 66 楼 java虫 2007-03-22 ahuaxuan 写道我测试过了,确实是只有抛出RuntimeException确实可以回滚,我找到之前的代码,之前测的时候是抛出了SQLException,SQLException是直接继承Exception。
谢谢daquan198163和dada。虽然如此,我认为这个贴还是一个好贴,因为之前贴的很多东西都蛮有价值的
<prop key="insert*">PROPAGATION_REQUIRED,-***Exception</prop>
transactionAttributes 定义中,默认情况是只有 RuntimeException 才会自动Rollback,
自己加上***Exception,就能回滚了。 67 楼 ahuaxuan 2007-03-22 java虫 写道ahuaxuan 写道我测试过了,确实是只有抛出RuntimeException确实可以回滚,我找到之前的代码,之前测的时候是抛出了SQLException,SQLException是直接继承Exception。
谢谢daquan198163和dada。虽然如此,我认为这个贴还是一个好贴,因为之前贴的很多东西都蛮有价值的
<prop key="insert*">PROPAGATION_REQUIRED,-***Exception</prop>
transactionAttributes 定义中,默认情况是只有 RuntimeException 才会自动Rollback,
自己加上***Exception,就能回滚了。
楼上没有仔细看这个贴,这个点我之前已经说了
ahuaxuan 写道
你说得对,我把without ejb翻了一下,p244,第6行,注意到了这个细节,只有运行时异常才会导致回滚,或者自己指定回滚规则,但是你看看这个连接,他是手动回滚的 68 楼 java虫 2007-03-23 奥,不好意思。
一讨论起spring的事务管理,好多人都来了,说明还没弄的完全明白,包括我。
搜了几个以前大牛们发的帖子。
1、解惑 spring 嵌套事务
http://www.iteye.com/topic/35907?page=1
2、spring事务探索
http://www.iteye.com/topic/11190?page=1
3、Spring事务管理与数据库连接
http://www.iteye.com/topic/11738
4、spring 管理事务总结--包括如何正确地回滚事务
http://www.iteye.com/topic/9842?page=1 69 楼 ahuaxuan 2007-03-23 在大家都没有完全弄清楚的情况下,这个贴就成了新手贴,可怜楼主被扣的30分呀,谢谢楼上,共同进步吧 70 楼 jamesby 2007-03-23 30分?这么多?不是10分吗?