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>
Answers
好了, 终于成功了, 呵呵
根据我的经验(教训), 可能有下面两个原因:
1. 如果你在service1()方法里直接调用service2(), 因为Spring是一个AOP框架, 这种情况下Spring没有机会把service2()加入transaction中; 必须有通过Spring的框架接口调用service2():
BeanFactory factory = (BeanFactory) context;
DAO mDAO = (DAO) factory.getBean("memberdao") ;
mDAO.service2();
2. 当service3()抛出异常后, 此异常被传到service2(), service1(), 如果没有在service1()中加入异常处理, service1()也被回滚.