有三个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>

解决方案 »

  1.   

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

  2.   

    那是不是就是说注入到哪个service中,就会沿用哪个service的事务?
      

  3.   

    不是哟,如果service3回滚那么service2,3都回滚,但1不会,如果service2回滚,1也不会回滚,因为它是新开的
      

  4.   

    因为你回滚的条件是rollback-for="java.lang.Exception",当你在service3中抛出异常时,service1和service2都会接受到异常,当然都回滚了你可以删除rollback-for="java.lang.Exception",吧代码中的try catch也删掉  这样你设置的事务特性就会起作用