浏览 2434 次
锁定老帖子 主题:发现用Spring配置事务不爽的一个地方
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-11
SomeService implement IService { public void deleteOrder(Order o){ ... } } 客户端调用: ... IService service .. service.deleteOrder(o); ... 配置了spring事务,一切都OK。 过了几天,WEB层要求增加批量删除接口,并且不作为一个事务,也就是说,如果某个order删除失败,并不影响后续order的操作和已经成功删除的order,只是在客户端给出提示成功了××个,×××失败。 好吧,修改接口,增加batchDeleteOrder(Order[] orders)接口,然后修改spring配置文件 。。。 public void batchDeleteOrder(Order o){ for...//循环调用deleteOrder } 然后修改spring的transactionAttribute,指定delete*方法启用事务,其他方法不使用事务(support) 然后客户端调用: ... IService service .. service.batchDeleteOrder(orders); ... 测试,发现删除竟然没有成功? 然后就是调试,发现调用batchDeleteOrder是,spring很正确的没有启动事务,然后循环调用每个deleteOrder,预期sping对单个deleteOrder方法调用启用事务,很遗憾,spring没有这么做! spring的事务其实是通过proxy我们的service来提供事务保护的,当我们调用service的某个方法时(注意,时someServive.***method这种形式的调用),spring会拦截下来,提供事务保护,然后调用真是的业务对象的方法,一旦我们进入真实的业务对象方法以后,所发生的调用本service内部的任何method,spring是无法知道的,也就不可能提供事务保护。解决的方法,就是把batch的内容放到action,循环调用deleteOrder,或者把batch部分的内容移出来到一个新的Interface。 总结:spring的transactionAttribute所配置的key值,仅仅对外部调用有效,也就是通过someservie.***方式才有效。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-11
拦截内部方法的调用,恐怕需要aspectJ
|
|
返回顶楼 | |
发表时间:2007-05-11
dennis_zane 写道 拦截内部方法的调用,恐怕需要aspectJ
aspectJ管用吗?没用过,不是很清楚,不过怀疑aspectJ能否实现,如果对内部方法进行拦截,似乎会造成递归? |
|
返回顶楼 | |