`

浅谈spring的事务传播

阅读更多
首先说明一下spring中事务传播的定义:
Spring定义了一下几种事务传播方式,在接口TransactionDefinition中。
int PROPAGATION_REQUIRED = 0;
//Support a current transaction, create a new one if none exists.
//支持当前事务,如果当前没有事务,则创建一个新事务。
int PROPAGATION_SUPPORTS = 1;
//Support a current transaction, execute non-transactionally if none exists.
//支持当前事务,如果当前没有事务,则以非事务方式执行。
int PROPAGATION_MANDATORY = 2;
//Support a current transaction, throw an exception if none exists.
//支持当前事务,如果当前没有事务,则抛出异常。
int PROPAGATION_REQUIRES_NEW = 3;
// Create a new transaction, suspend the current transaction if one exists.
//创建一个新事务,如果当前存在一个事务,则挂起当前事务。言下之意,就是不管你当前有没有事务,我执行我的,对外界不关心,且不能干扰我。
int PROPAGATION_NOT_SUPPORTED = 4;
// Execute non-transactionally, suspend the current transaction if one exists.
//以非事务方式执行。如果当前存在事务,则挂起当前事务。
int PROPAGATION_NEVER = 5;
// Execute non-transactionally, throw an exception if a transaction exists.
//以非事务方式执行,如果以事务方式执行,则抛出异常。
int PROPAGATION_NESTED = 6;
// Execute within a nested transaction if a current transaction exists,
//如果当前事务存在,则以嵌套事务的方式执行。否则就按照它自己的事务方式执行。

理解事务传播方式对于我们使用事务,处理业务逻辑异常,jdbc本身异常有更清晰的认识。
现在举例说明:
1. 如果在同一个service中方法互掉。methodA方法是PROPAGATION_REQUIRED传播方式,如果methodA方法调用同一个service中的methodB方法(可以更多),那么声明事务的方式只对methodA方法(名称)有作用,且这些方法都处于同一个事务中。所以这种同一个service中的方法调用形同一个方法。
2. 如果一个service的方法调用另外一个service的方法。如果serviceA的方法methodA1和serviceB的方法methodB1都是PROPAGATION_REQUIRED方式,methodA1调用methodB1方法,则这两个方法处于同一个事务中。
3. 如果一个service的方法调用另外一个service的方法。如果serviceA的方法methodA1是PROPAGATION_REQUIRED方式,而serviceB的方法methodB1是PROPAGATION_REQUIRES_NEW方式,methodA1调用methodB1方法,则这两个方法处于各自的事务中,可以完全独立。

问题个关键是同一个事务的概念以及表现: 比如有多个数据库操作(增删改),本质上同一个事务就是让这些操作同时执行(不管调用的先后顺序)。Spring的声明性事务使用AOP实现,那么我们写的dao和service方法的本身没有任何的事务打开和关闭,所以要捕获jdbc提交时候的错误(比如主键重复,字段超过最大值等错误),只有调用具有完整事务周期service方法的其它方法(比如action类的方法)才能捕获这些异常。比如上面的第三种情况描述的两个独立事务的调用,methodA1中就可以捕获methodB1的jdbc异常,因为这两个事务完全隔离的。

关于spring的dao和service异常处理,如果是来自jdbc运行时候产生的异常,在dao和service方法内部是捕获不到这些异常,这些异常只能在事务提交的时候产生,如果我们使用spring的声明性事务(AOP实现),那么这个异常是在service类的代理类中抛出的(这个时候执行service的方法,提交事务,有异常产生,然后向外抛出),所以我们在service层肯定无法捕获这种异常(当然也不是绝对的,如果service中调用其它service的方法,而且这个被调用的PROPAGATION_REQUIRES_NEW是这种事务传播类型,这个被调用service方法的异常是可以捕获的)
分享到:
评论

相关推荐

    浅谈Spring事务传播行为实战

    浅谈Spring事务传播行为实战 Spring框架提供了事务管理的标准实现,通过注解或者XML文件的方式声明和配置事务。事务管理是指按照给定的事务规则来执行事务的提交或者回滚操作。事务的机制实现很大一部依赖事务日志...

    spring 事务传播 demo

    本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...

    Spring中事务的传播属性详解

    本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### 二、事务传播属性概述 事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,...

    Spring事务传播机制.docx

    Spring 事务传播机制 Spring 事务传播机制是指在 Spring 框架中,事务的传播和嵌套机制。当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套...

    Spring事务传播特性解析

    通过代码解析spring传播特性,包括 1、Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、...

    spring 事务传播

    通过上述对Spring事务传播行为的详细介绍,我们可以看出,正确理解和应用这些传播行为对于构建健壮的事务管理机制至关重要。每种传播行为都有其特定的应用场景和限制条件,开发者应根据具体的业务逻辑和需求来合理...

    Spring事务传播Demo.zip

    本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...

    spring事务的传播特性和事务隔离级别

    Spring提供了七种事务传播特性,每一种都有其特定的场景适用性。 1. **PROPAGATION_REQUIRED** - 这是最常用的传播行为。当使用此传播行为时,如果当前存在事务,则在该事务中执行;如果没有,则创建一个新的事务...

    SPRING事务传播特性&事务隔离级别

    ### Spring 事务传播特性和事务隔离级别详解 #### 一、Spring 事务传播特性 在进行多层服务架构设计时,事务的管理尤其重要。为了确保数据的一致性,Spring 提供了一种灵活的方式来控制事务的传播行为。下面详细...

    spring 事务传播与隔离级别DEMO

    本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...

    Spring事务传播属性

    Spring事务传播属性是这一机制的关键组成部分,它定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务的边界。在深入理解Spring事务传播属性之前,我们首先需要了解Spring中的事务管理模型,包括编程式...

    Spring事务的传播特性和隔离级别

    Spring框架提供了多种事务传播特性,用于控制事务在方法调用之间的传播方式。这些传播特性定义了当一个事务方法调用另一个事务方法时的行为: 1. **Propagation_Required**:如果当前存在事务,则继续使用该事务;...

    spring事务几种传播方式

    ### Spring事务传播方式详解 #### 一、引言 在基于Spring框架开发的应用程序中,事务管理是一项重要的功能。为了确保数据的一致性和完整性,合理地配置事务的传播行为至关重要。Spring提供了多种事务传播行为选项...

    Spring事务流程图

    5. **事务传播行为**:Spring提供了七种事务传播行为,如REQUIRED(默认)、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED,它们决定了事务如何在方法调用之间传播。 时序图是一种UML建模工具...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    Spring事务传播原理及数据库事务操作原理.rar

    总的来说,Spring事务传播原理和数据库事务操作原理是Java开发人员必须掌握的核心知识。理解这些原理,能够帮助我们在开发过程中更好地处理数据一致性问题,保证系统的稳定性和可靠性。通过对Spring事务机制的熟练...

    spring事物传播测试表

    事务传播行为(Transaction Propagation)是Spring事务管理中一个关键的概念,用于定义在一个事务方法被调用时,如何与当前运行的事务进行交互。本文将深入探讨“Spring事物传播测试表”所涉及的知识点。 首先,...

    Spring事务传播类型.md

    Spring事务传播类型.md

Global site tag (gtag.js) - Google Analytics