`
balaschen
  • 浏览: 193817 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

阅读更多
举个例子:
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.***方式才有效。
分享到:
评论
2 楼 balaschen 2007-05-11  
dennis_zane 写道
拦截内部方法的调用,恐怕需要aspectJ

aspectJ管用吗?没用过,不是很清楚,不过怀疑aspectJ能否实现,如果对内部方法进行拦截,似乎会造成递归?
1 楼 dennis_zane 2007-05-11  
拦截内部方法的调用,恐怕需要aspectJ

相关推荐

    spring2,spring3 相关技术文档

    Spring 2.0是Spring框架的一个里程碑版本,它引入了Spring MVC,一个强大的Web应用开发模型,以及对AspectJ的深度集成,使得AOP的实现更加灵活。此外,Spring 2.0还加强了事务管理,提供了声明式事务处理,以及对JMS...

    java事务 - 使用动态代理

    - 在Java中,Spring框架提供了强大的AOP支持,可以使用注解或XML配置来声明式地管理事务。 3. **Spring中的动态代理事务管理**: - Spring通过两种方式实现动态代理:JDK动态代理和CGLIB代理。前者适用于接口实现...

    spring项目开发学习笔记

    Spring是一个轻量级的DI/IoC和AOP容器框架。存在的目的是用于构建轻量级的J2EE应用。 轻量级:应用大小和应用开支,包括应用方式 依赖注入DI/IoC控制反转:提供松耦合的一种实现技术 AOP面向切面编程:(可以在不...

    SSM框架整合包非maven项目,干净清爽,包括Dao层自动生成包

    在本项目中,你可能发现Spring配置文件(如`applicationContext.xml`),其中定义了Bean的创建、依赖关系以及生命周期管理。同时,Spring MVC是Spring的一个模块,负责处理HTTP请求,它将请求映射到相应的Controller...

    spring的@Transactional注解用法解读

    在Spring中,`DataSourceTransactionManager`会负责关闭自动提交模式,确保事务的一组操作作为一个整体执行。如果数据库连接池不支持关闭自动提交,Spring会在每次打开连接时进行设置。C3P0连接池默认不会在关闭时...

    ssh网上书店代码

    SSH网上书店代码是一个基于Struts、Spring和Hibernate这三个框架集成开发的项目,旨在实现一个简易的在线购书系统。SSH是Java开发Web应用时常用的三大框架,分别负责表现层、业务逻辑层和数据访问层的功能。 1. **...

    蓝色的oa办公系统后台管理界面模板源码

    它通常包含用户管理、权限控制、系统配置、数据统计等功能,为用户提供了一个安全、高效的操作平台。 【源码】源码是程序设计的基础,它是计算机语言编写的未经编译或解释的原始代码。对于OA办公系统的源码,开发者...

Global site tag (gtag.js) - Google Analytics