关于事务和嵌套事务,帖子 http://www.javaeye.com/topic/35907 说得很清楚了,可是实现细节遇到其他的问题了。
有这样一个服务:
public class ServiceImpl implements Service {
//方法A声明成了一个REQUIRED事务,在A中调用B,B是基本插入操作,希望把B声明成一个NESTED事务,某一条B失败回滚本次B事务,
//全部完成能获得成功和失败的B事务条数的返回信息。
methodA() {
for (int i, i< 10 , i++){
nestMethodB() ;}
}
nestMethodB() {}
}
配置如下:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true" />
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="nest*" read-only="false" //这里是methodB
propagation="NESTED" rollback-for="XXDataAccessException" /> //XXDataAccessException是自己声明抛出的异常
<tx:method name="*" read-only="false"
propagation="REQUIRED" rollback-for="XXDataAccessException" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="ServiceOperation"
expression="execution(* x.y.ServiceImpl.*(..))" /> //意图是aop里面能invoke方法A和B
<aop:advisor advice-ref="txAdvice"
pointcut-ref="ServiceOperation" />
</aop:config>
运行结果: 执行到方法A的时候,log显示新建了一个 PROPAGATION_REQUIRED 事务,执行到方法B的时候的时候并不会生成一个NESTED内部事务;
本人google了一下,发现一个解释:
在spring中创建的事务代理类并是目标类的超类,只是一个实现这目标类接口的类,该类会调用目标类的方法,所在如果一个目标类中的方法调用自身的
另一个事务方法,另一个方法只是作为普通方法来调用,并不会加入事务机制.
详见: http://blog.csdn.net/sylilzy/archive/2006/06/14/796894.aspx
问题一:有没有方法能够让内部调用方法也能进行代理,增加事务控制呢??
问题二:通过抛出异常来控制回滚,本例中每次回滚事务A然后直接结束了,如何回滚事务B继续执行下一个事务B呢?
如果catch住这个异常的话,回滚机制就不起作用了。