发现用Spring配置事务不爽的一个地方

举个例子:
[code]
SomeService implement IService {
public void deleteOrder(Order o){
...
}
}
[/code]

客户端调用:
[code]
...
IService service ..
service.deleteOrder(o);
...
[/code]

配置了spring事务,一切都OK。

过了几天,WEB层要求增加批量删除接口,并且不作为一个事务,也就是说,如果某个order删除失败,并不影响后续order的操作和已经成功删除的order,只是在客户端给出提示成功了××个,×××失败。

好吧,修改接口,增加batchDeleteOrder(Order[] orders)接口,然后修改spring配置文件
[code]
。。。
public void batchDeleteOrder(Order o){
for...//循环调用deleteOrder
}

[/code]

然后修改spring的transactionAttribute,指定delete*方法启用事务,其他方法不使用事务(support)

然后客户端调用:
[code]
...
IService service ..
service.batchDeleteOrder(orders);
...
[/code]

测试,发现删除竟然没有成功?
然后就是调试,发现调用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.***方式才有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值