`

Spring 事务传播属性

 
阅读更多
一、Propagation (事务的传播属性)

  Propagation属性指定事务传播行为。有以下选项可供使用:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

  PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

  PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

  PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

  1: PROPAGATION_REQUIRED

  加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务

  比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED,
那么由于执行ServiceA.methodA的时候,

  ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA

  的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。

  这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被

  提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚

  2: PROPAGATION_SUPPORTS

  如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行

  3: PROPAGATION_MANDATORY

  必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常

  4: PROPAGATION_REQUIRES_NEW

  这个就比较绕口了。
比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,

  那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,

  他才继续执行。他与PROPAGATION_REQUIRED
的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在

  两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,

  如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

  5: PROPAGATION_NOT_SUPPORTED

  当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED
,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,

  那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。

  6: PROPAGATION_NEVER

  不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED,
而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,

  那么ServiceB.methodB就要抛出异常了。

  7: PROPAGATION_NESTED

  理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,

  而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。

  而Nested事务的好处是他有一个savepoint。

  *****************************************  ServiceA {

  /**

  * 事务属性配置为 PROPAGATION_REQUIRED

  */

  void methodA() {

  try {

  //savepoint

  ServiceB.methodB(); //PROPAGATION_NESTED 级别

  } catch (SomeException) {

  // 执行其他业务, 如 ServiceC.methodC();

  }

  }

  }

  ********************************************

  也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA也会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如

  ServiceC.methodC,继续执行,来尝试完成自己的事务。

  但是这个事务并没有在EJB标准中定义。




二 Spring事务的隔离级别

  1. ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

  另外四个与JDBC的隔离级别相对应

  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。

  这种隔离级别会产生脏读,不可重复读和幻像读。

  3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。

  它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

  除了防止脏读,不可重复读外,还避免了幻像读。

  什么是脏数据,脏读,不可重复读,幻觉读?

  脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,

  另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一

  个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

  不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。

  那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据

  可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

  幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及

  到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,

  以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
分享到:
评论

相关推荐

    Spring事务传播属性

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

    Spring中事务的传播属性详解

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

    spring 事务传播

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

    Spring事务传播属性和隔离级别详细介绍

    Spring事务传播属性和隔離级别详细介绍 Spring事务传播属性(Propagation)是指在事务中如何处理事务边界的规则。它定义了事务如何与其他事务进行交互,例如是否支持当前事务、创建新的事务、抛出异常等。 1. ...

    Spring事务传播特性解析

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

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

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

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

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

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

    spring事物传播测试表

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

    02.Spring支持的常用数据库事务传播属性和事务隔离级别.zip

    本资料主要探讨的是Spring支持的数据库事务传播属性和事务隔离级别。 一、事务传播属性 1. REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。这是最常见的事务定义,适用于...

    Spring在Transaction事务传播行为种类

    -- 下面定义事务传播属性 --> *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED,readOnly *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED *">PROPAGATION_REQUIRED <!-- 定义...

    spring事务案例分析.zip

    5. **事务传播行为**:Spring定义了七种事务传播行为,如PROPAGATION_REQUIRED(默认行为,新建事务或加入当前事务)、PROPAGATION_SUPPORTS(如果存在事务,则加入,否则无需事务)、PROPAGATION_MANDATORY(必须在...

    Spring事务详细讲解

    Spring事务详细讲解 在 Spring 框架中,事务管理扮演着非常重要的角色。Spring 声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要...

    02-01-10-Spring事务传播原理及数据库事务操作原理1

    在本课程中,我们将深入探讨Spring事务传播原理和数据库事务操作的基本概念,这对于有Spring开发经验的人员来说,是进一步深化事务控制理解的关键。我们还将触及分布式事务的初步知识,帮助开发者更好地掌握基于...

    通过实际案例摸清楚Spring事务传播的行为.docx

    通过这样的实际案例分析,我们可以更直观地看到不同事务传播行为在实际应用中的效果,从而加深对Spring事务管理的理解。在实际开发中,根据业务需求正确选择事务传播行为,有助于保证数据的一致性和完整性。

    Spring事务小demo

    这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...

    Spring事务管理的jar包

    除了基本的事务控制,Spring还提供了丰富的事务属性,如传播行为(PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS等)、隔离级别(ISOLATION_DEFAULT、ISOLATION_READ_UNCOMMITTED等)和事务超时设置,允许开发者根据...

    这一次搞懂Spring事务是如何传播的

    本文将深入探讨Spring事务的传播行为,帮助读者理解如何在不同情况下正确配置和使用事务。 首先,让我们定义一下术语“事务传播”:在多层服务架构中,当一个事务方法被另一个事务方法调用时,事务的传播行为决定了...

    spring学习事务源码

    此外,Spring的事务传播行为(PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW等)是另一个重要概念,它定义了在一个事务中的方法如何启动新的事务或者加入到当前事务中。例如,PROPAGATION_REQUIRED表示如果当前...

Global site tag (gtag.js) - Google Analytics