当前位置:编程学习 > JAVA >>

spring事务及回滚问题,求助~~~

有三个service,分别为service1,service2,service3,分别采用的事务特性是REQUIRED,REQUIRES_NEW,REQUIRED,其中service1调用service2,service2调用service3,然后在service3中出现错误,想问service3使用的是service1的事务,还是service2的事务?为何事务回滚后service1,service2均被影响,数据库全都不添加数据?
spring事务特性设置代理如下:
<tx:attributes>

<tx:method name="service1" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
<tx:method name="service2" propagation="REQUIRES_NEW" read-only="false"
rollback-for="java.lang.Exception" />
<tx:method name="service2" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />

</tx:attributes>

--------------------编程问答-------------------- 第一个问题。service3使用的是service2的事务。
第二、你service3出异常导致service2的事务回滚,如果service2没有try{service3()}catch{},那么异常将继续抛出,所以service2也方法也会抛出异常。

此时如果如果service1没有try{service2()}catch{},那么异常将继续向上层抛出,所以service1也方法也会抛出异常。Spring框架发现service1方法抛出了异常,按照你的配置,就把service1的事务也回滚了

--------------------编程问答-------------------- 那是不是就是说注入到哪个service中,就会沿用哪个service的事务? --------------------编程问答-------------------- 不是哟,如果service3回滚那么service2,3都回滚,但1不会,如果service2回滚,1也不会回滚,因为它是新开的 --------------------编程问答-------------------- 因为你回滚的条件是rollback-for="java.lang.Exception",当你在service3中抛出异常时,service1和service2都会接受到异常,当然都回滚了

你可以删除rollback-for="java.lang.Exception",吧代码中的try catch也删掉  这样你设置的事务特性就会起作用
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,