`
balaschen
  • 浏览: 192184 次
  • 性别: 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

相关推荐

    Spring配置JTA事务管理

    声明式事务管理是Spring的一个强大特性,只需在服务层的方法上添加`@Transactional`注解,Spring就会自动处理事务的开始、提交、回滚等操作。 除了上述基本配置,你可能还需要关注以下几点: - 恢复机制:JTA支持...

    Spring AOP配置事务方法

    该元素用于定义一个事务特性,包括事务的传播行为、回滚规则等。在上面的配置文件中,我们可以看到 `<tx:advice>` 元素用于定义一个名为 "sgis.sdk.txAdvice" 的事务特性,该特性将所有以 "add*"、"delete*"、...

    spring声明事务的配置

    - `PROPAGATION_NEVER`:不允许在事务中运行,如果已经在一个事务中,将抛出异常。 - `PROPAGATION_REQUIRES_NEW`:总是新建一个事务,如果存在事务,暂停当前事务。 - `PROPAGATION_SUPPORTS`:如果当前存在事务...

    spring事务配置的五种方式

    2. **基于注解的事务配置**:通过在服务层类或方法上使用`@Transactional`注解来配置事务,这是最常用的方式之一。这种方式大大简化了事务配置,提高了代码的可读性和可维护性。 3. **基于AspectJ的事务配置**:...

    spring3.0两种事务管理配置

    这种方法只需要在 Spring 配置文件中定义一个事务管理对象(如 DataSourceTransactionManager),然后加入 `<tx:annotation-driven/>` 节点,引用该事务管理对象,然后即可在需要进行事务处理的类和方法使用 `@...

    Spring事务配置的五种方式

    在这种配置方式中,每个需要事务管理的Bean都会有一个事务代理。通过`TransactionProxyFactoryBean`创建代理,每个业务逻辑方法都将在事务环境中执行。配置中,`transactionManager`属性用于指定事务管理器,`...

    spring配置事务五种方式.doc

    接着,定义了一个UserDaoImpl的Bean(DAO层),并使用AOP(面向切面编程)为其创建一个代理,以实现事务管理。代理会在方法调用前后添加事务边界,确保事务的正确回滚或提交。 2. **使用tx标签配置的代理** Spring...

    Spring 事务代理配置

    Spring是一个开源的Java平台,它提供了一套全面的编程和配置模型,主要用于简化企业级应用的开发。其中,依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)是其两大...

    spring声明式事务配置

    4. **TransactionProxyFactoryBean**:这是一种使用代理模式的声明式事务配置方法,为DAO层的方法提供事务支持。 ```xml <bean id="userDao" class="org.springframework.transaction.interceptor....

    spring事务与数据库操作

    这段代码配置了一个事务管理器,并定义了一个事务顾问(`tx:advice`),该顾问指定了不同方法名前缀对应的不同事务传播行为。例如,所有以`save`开头的方法都将使用`REQUIRED`传播行为,这意味着如果当前存在事务,...

    Spring配置事务处理

    这是在java里使用到spring的配置文件里,添加事务处理过程,以至于可以回滚事务,当中使用到拦截器。

    Spring基于XML方式配置事务

    在Spring配置文件中,我们需要引入`tx`命名空间,并声明一个`PlatformTransactionManager`实例,例如,对于基于JDBC的事务管理,我们会使用`<bean id="transactionManager" class="org.springframework.jdbc....

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    spring事务配置的5中方式

    Spring 事务配置是Spring框架中不可或缺的一部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager和代理机制。...

    spring的事务管理配置

    spring的事务管理配置详解.txt详细的描述了如何配置spring的事物。

    Spring事务原理、Spring事务配置的五种方式

    PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前...

    spring事务操作试验

    例如,可以使用@Transactional注解在方法级别声明一个事务,该方法内的所有数据库操作将在同一个事务中执行。 文件名如"spring-jdbc-tran1"、"spring-jdbc-tran2"和"spring-jdbc-tran3"暗示了实验可能涉及Spring与...

    spring几种事务配置详解【精】

    如果已经存在一个事务,则加入到这个事务中。 - `SUPPORTS`:如果当前存在事务,就加入;如果没有事务,则不开启。 - `MANDATORY`:如果当前存在事务,就加入;如果没有事务,抛出异常。 - `REQUIRES_NEW`:总是...

    详解Spring配置事务的五种方式

    首先,Spring配置事务通常涉及三个关键组件: 1. **DataSource**:数据源,它是连接到数据库的桥梁,负责管理数据库连接。在使用Hibernate等ORM框架时,DataSource可能会被SessionFactory替代,因为SessionFactory...

Global site tag (gtag.js) - Google Analytics