举个例子:
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.***方式才有效。
分享到:
相关推荐
spring事务配置详解 spring事务配置详解
spring声明事务的配置 spring声明事务的配置 spring声明事务的配置
Spring 事务代理配置 Spring 事务代理配置
spring配置 spring配置 spring配置 spring配置 spring配置
这是在java里使用到spring的配置文件里,添加事务处理过程,以至于可以回滚事务,当中使用到拦截器。
很好的spring+ibatis事务的配置文档.
spring的事务管理配置详解.txt详细的描述了如何配置spring的事物。
Spring AOP配置事务方法,描述了spring的事务配置,方便开发应用和数据库的连接管理。
spring配置事务五种方式 代初学都参考使用
spring几种事务配置,spring几种事务配置详解【精】
Spring的事务配置的五种方式 Spring的事务配置的五种方式 Spring的事务配置的五种方式 Spring的事务配置的五种方式
Spring声明式事务配置管理方法
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...
全面解析spring事务配置的五种方式,好不容易找到的
Spring基于XML方式配置事务
spring3.0两种事务管理配置
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...
Spring事务原理、Spring事务配置的五种方式
ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssm...