举个例子:
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的一个强大特性,只需在服务层的方法上添加`@Transactional`注解,Spring就会自动处理事务的开始、提交、回滚等操作。 除了上述基本配置,你可能还需要关注以下几点: - 恢复机制:JTA支持...
该元素用于定义一个事务特性,包括事务的传播行为、回滚规则等。在上面的配置文件中,我们可以看到 `<tx:advice>` 元素用于定义一个名为 "sgis.sdk.txAdvice" 的事务特性,该特性将所有以 "add*"、"delete*"、...
- `PROPAGATION_NEVER`:不允许在事务中运行,如果已经在一个事务中,将抛出异常。 - `PROPAGATION_REQUIRES_NEW`:总是新建一个事务,如果存在事务,暂停当前事务。 - `PROPAGATION_SUPPORTS`:如果当前存在事务...
2. **基于注解的事务配置**:通过在服务层类或方法上使用`@Transactional`注解来配置事务,这是最常用的方式之一。这种方式大大简化了事务配置,提高了代码的可读性和可维护性。 3. **基于AspectJ的事务配置**:...
这种方法只需要在 Spring 配置文件中定义一个事务管理对象(如 DataSourceTransactionManager),然后加入 `<tx:annotation-driven/>` 节点,引用该事务管理对象,然后即可在需要进行事务处理的类和方法使用 `@...
在这种配置方式中,每个需要事务管理的Bean都会有一个事务代理。通过`TransactionProxyFactoryBean`创建代理,每个业务逻辑方法都将在事务环境中执行。配置中,`transactionManager`属性用于指定事务管理器,`...
接着,定义了一个UserDaoImpl的Bean(DAO层),并使用AOP(面向切面编程)为其创建一个代理,以实现事务管理。代理会在方法调用前后添加事务边界,确保事务的正确回滚或提交。 2. **使用tx标签配置的代理** Spring...
Spring是一个开源的Java平台,它提供了一套全面的编程和配置模型,主要用于简化企业级应用的开发。其中,依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)是其两大...
4. **TransactionProxyFactoryBean**:这是一种使用代理模式的声明式事务配置方法,为DAO层的方法提供事务支持。 ```xml <bean id="userDao" class="org.springframework.transaction.interceptor....
这段代码配置了一个事务管理器,并定义了一个事务顾问(`tx:advice`),该顾问指定了不同方法名前缀对应的不同事务传播行为。例如,所有以`save`开头的方法都将使用`REQUIRED`传播行为,这意味着如果当前存在事务,...
这是在java里使用到spring的配置文件里,添加事务处理过程,以至于可以回滚事务,当中使用到拦截器。
在Spring配置文件中,我们需要引入`tx`命名空间,并声明一个`PlatformTransactionManager`实例,例如,对于基于JDBC的事务管理,我们会使用`<bean id="transactionManager" class="org.springframework.jdbc....
很好的spring+ibatis事务的配置文档.
Spring 事务配置是Spring框架中不可或缺的一部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager和代理机制。...
spring的事务管理配置详解.txt详细的描述了如何配置spring的事物。
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前...
例如,可以使用@Transactional注解在方法级别声明一个事务,该方法内的所有数据库操作将在同一个事务中执行。 文件名如"spring-jdbc-tran1"、"spring-jdbc-tran2"和"spring-jdbc-tran3"暗示了实验可能涉及Spring与...
首先,Spring配置事务通常涉及三个关键组件: 1. **DataSource**:数据源,它是连接到数据库的桥梁,负责管理数据库连接。在使用Hibernate等ORM框架时,DataSource可能会被SessionFactory替代,因为SessionFactory...
- `REQUIRES_NEW`:总是新建一个事务,如果当前存在事务,则暂停当前事务。 - `NOT_SUPPORTED`:总是运行在非事务环境中,如果当前存在事务,则暂停事务。 - `NEVER`:总是运行在非事务环境中,如果当前存在事务,则...