今天看到一个账务处理中处理失败更新代扣交易流水状态,然后立即抛出异常回滚。以为是错误,后来问过别人后,自己又看了看,突然发现是自己错了。在网上查了一下事务的传播属性发现自己把这两个给弄错了。记录一下。
同时在网上看到有说调用同类的方法事务处理错误的情况,关于这一点是因为同一个类中的方法调用无法使用aop,当我们调用第一个方法时使用的是Spring的AOP代理,但是当你在第一个方法中调用另一个方法时时直接跳转到第二个方法,这样就没有使用代理无法使用事务。
比如一个业务类中有方法batchMethod() ,但是batchMethod()中调用了同一个业务类中的处理方法handleDKRecord(),handleDKRecord()方法有事务Propagation.REAUIRES_NEW,那么在batchMethod直接调用handleDKRecord方法进行处理时目的是每调用一次就开启一个事务,通过这样的方式来保证如果有一条数据处理失败则返回相应参数供记录或者进行当前事务的回滚,而不是因为一条数据处理的失败就影响整个批处理,将整个批处理回滚。但是当你在batchMethod方法中调用handleDKRecord方法时会发现无法开启事务。
处理方法是在第一个方法batchMethod() 中获取当前的代理对象,然后再通过代理对象调用其他方法,这样才能保证添加到方法上的@Transactional生效。
Propagation.REQUIRED
假如当前正要执行的方法需要一个事务,而当前没有事务,那么就起一个新的事务。
比如说ServiceA.methodA在运行的时候发现自己没有在事务中,它就会为自己分配一个事务。ServiceB.methodB的事务级别也定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务,这时在A中调用ServiceB.methodB,ServiceB.methodB看到当前已经有一个在运行的事务ServiceA.methodA ,就不会再起新的事务而是加入到A的事务中去。这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来要回滚,ServiceB.methodB也要回滚
PROPAGATION_REQUIRES_NEW
当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后ServiceA.methodA才继续执行。它与PROPAGATION_REQUIRED 的事务区别在于是要共用一个事务还是要相互独立,要是需要事务的相互独立互不影响,即各自回滚就使用NEW。因为ServiceB.methodB是独立于A的事务,所以就算在A中调用了B,且B抛异常失败回滚,但是也不影响A的执行,同样A失败了也不影响B的结果不会回滚B。
分享到:
相关推荐
本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### 二、事务传播属性概述 事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,...
Spring事务传播属性是这一机制的关键组成部分,它定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务的边界。在深入理解Spring事务传播属性之前,我们首先需要了解Spring中的事务管理模型,包括编程式...
Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...
本资料主要探讨的是Spring支持的数据库事务传播属性和事务隔离级别。 一、事务传播属性 1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。这是最常见的事务定义,适用于...
事务传播特性&事务隔离级别 事务传播特性是指在 Java 中,事务的传播行为,即在多个事务之间如何交互和传播。Java 中有七种事务传播特性,分别是: 1. PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。...
通过代码解析spring传播特性,包括 1、Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用... 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。
### Spring 事务传播属性详解 #### 一、Spring 事务基础概述 在深入探讨Spring框架中的事务传播属性之前,我们先来简要回顾一下Spring事务的基础概念。Spring框架提供了强大的事务管理功能,允许开发者通过声明式...
Spring提供了七种事务传播特性,每一种都有其特定的场景适用性。 1. **PROPAGATION_REQUIRED** - 这是最常用的传播行为。当使用此传播行为时,如果当前存在事务,则在该事务中执行;如果没有,则创建一个新的事务...
### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...
08_SSM面试题_Spring支持的常用数据库事务传播属性和...
-- 下面定义事务传播属性 --> *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED,readOnly *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED <!-- 定义...
Spring事务传播属性和隔離级别详细介绍 Spring事务传播属性(Propagation)是指在事务中如何...Spring事务传播属性和隔离级别是对事务进行管理和控制的重要机制,可以帮助开发者更好地管理事务,避免各种并发问题。
1. 事务的传播行为:定义了在一个事务方法被调用时,应该如何处理已经存在的事务。例如,PROPAGATION_REQUIRED表示如果当前存在事务,则加入到当前事务,否则新建一个事务。TransactionDefinition接口中的...
首先,让我们定义一下术语“事务传播”:在多层服务架构中,当一个事务方法被另一个事务方法调用时,事务的传播行为决定了这两个方法间的事务关系。Spring支持七种不同的事务传播行为,它们分别是: 1. **...
Spring 事务传播行为是Spring框架中事务管理的重要组成部分,它定义了在多个方法相互调用时,事务如何在这些方法间传播。理解这些行为对于确保应用程序的事务一致性至关重要。接下来,我们将通过具体的案例来深入...
Spring框架的7种事务传播行为是事务管理的关键概念,它们定义了在多个方法相互调用时,事务应该如何在这些方法间传播。理解这些行为对于确保应用程序的事务一致性至关重要。 1. **PROPAGATION_REQUIRED**: 这是最...
事务传播行为(Transaction Propagation)是Spring事务管理中一个关键的概念,用于定义在一个事务方法被调用时,如何与当前运行的事务进行交互。本文将深入探讨“Spring事物传播测试表”所涉及的知识点。 首先,...
给定的示例代码展示了如何通过配置`order`属性来解决事务失效的问题: ```xml <!-- 声明使用注解式事务 --> ``` 这里的`order`属性被设置为200,这意味着事务管理器的优先级相对较高。接下来,自定义切面的...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
2. **事务传播行为**: 事务的传播行为定义了在一个事务方法被另一个事务方法调用时,如何处理新的事务上下文。在Spring中,通过`<tx:advice>`标签来配置。例如: ```xml *" propagation="REQUIRED"/> ... ...