论坛首页 入门讨论版 Java

Spring声明式事务控制中AOP之方法调用?

浏览 80 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-05-16

关于事务和嵌套事务,帖子 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住这个异常的话,回滚机制就不起作用了。



 

   
时间:2008-05-16
不好意思,发现管理员已经把这篇帖子转过本新手区了,没找到删除控制,请管理员删除掉吧。
   
0 请登录后投票
论坛首页 入门讨论版 Java

跳转论坛:
JavaEye推荐