事务隔离级别

Spring事务管理

时间秒杀一切 提交于 2020-01-04 01:39:00
1.Spring事务介绍: 什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务的4个特性(ACID): 1)原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。 2)一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。 3)隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。 4)持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。 2.事务管理器 :JDBC、Hibernate、JPA、JTA四种事务管理器。 spring事务管理原理是动态代理。 3.基本事务属性 3.1 事务的5种隔离级别 并发事务引起的问题: 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务。并发虽然是必须的,但可能会导致以下的问题 : 脏读 :一个事务读到了另一个事务的 未提交 的update数据 . 不可重复读 :一个事务读到了另一个事务 已经提交 的 update

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

我的梦境 提交于 2020-01-04 01:37:34
传播行为 事务的第一个方面是传播行为。传播行为定义关于客户端和被调用方法的事务边界。Spring定义了7中传播行为。 传播行为 意义 PROPAGATION_MANDATORY [ propagation_manadatory ] 表示该方法 必须运行 在一个事务中。如果当前没有事务正在发生,将 抛出一个异常 PROPAGATION_NESTED [ propagation_nested ] 表示如果当前正有一个事务在进行中,则该方法应当运行在一个 嵌套式事务 中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样。 PROPAGATION_NEVER [ propagation_never ] 表示当前的方法 不应该在一个事务中运行 。如果一个事务正在进行,则会 抛出一个异常 。 PROPAGATION_NOT_SUPPORTED [ propagation_not_supported ] 表示该方法 不应该 在一个事务中运行。如果一个现有事务正在进行中,它将在该方法的运行期间 被挂起 。 PROPAGATION_SUPPORTS [ propagation_supports ] 表示当前方法 不需要 事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行。 PROPAGATION

SpringBoot 事务隔离性和传播性

隐身守侯 提交于 2020-01-04 01:37:15
propergation 传播性 Spring中七种Propagation类的事务属性详解: REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。 isolation 隔离性 声明式事务的第二个方面是隔离级别。隔离级别定义一个事务可能受其他并发事务活动活动影响的程度。另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度。 在一个典型的应用程序中,多个事务同时运行,经常会为了完成他们的工作而操作同一个数据。并发虽然是必需的,但是会导致一下问题: 脏读(Dirty read)-- 脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的。 不可重复读(Nonrepeatable read)--

Spring事务的传播行为、隔离级别、回滚、只读和过期

瘦欲@ 提交于 2020-01-04 01:35:45
事务的传播性 - 当事务的方法被另一个事务的方法调用时,必须指定事务应该如何传播。如:方法可能继续在现有的事务中运行,也可能开启一个新的事务,并在自己的事务中运行。 - 事务的传播行为可以由传播属性指定。Spring定义了7种传播行为: required:如果有事务在运行,当前的方法就在这个事务内运行,否则就开启一个新的事务,并在自己的事务内运行(常用) required_new:当前的方法必须启动新事务,并在它自己的事务内运行。如果有事务在运行,应该将其挂起。(常用) supports:如果有事务在运行,当前这个方法就在这个事务内运行,否则它可以不运行在事务中 not_supported:当前的方法不应该运行在事务中,如果有运行的事务则将其挂起 mandatory:当前的方法必须运行在事务内,如果没有正在运行的事务,则抛出异常 never:当前方法不应该运行在事务中,如果有运行的事务,则抛出异常 nested:如果有事务在运行,当前方法就应该在这个事务的嵌套是事务内运行,否则就启动一个新的事务,并在自己的事务内运行 required传播行为:使用调用者的事务 requires_new传播行为:表示该方法必须启动一个新事务,并在自己的事务内运行,如果有事务在运行就先挂起它。 隔离级别、回滚、只读和过期 - 当同一个应用程序或不同应用程序中的多个事务在同一个数据集上并发执行的时候

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

谁说胖子不能爱 提交于 2020-01-04 01:35:19
在Spring中,声明式事务是用事务参数来定义的。一个事务参数就是对事务策略应该如何应用到某个方法的一段描述,如下图所示一个事务参数共有5个方面组成: 传播行为 事务的第一个方面是传播行为。传播行为定义关于客户端和被调用方法的事务边界。Spring定义了7中传播行为。 传播行为 意义 PROPAGATION_MANDATORY 表示该方法必须运行在一个事务中。如果当前没有事务正在发生,将抛出一个异常 PROPAGATION_NESTED 表示如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样。 PROPAGATION_NEVER 表示当前的方法不应该在一个事务中运行。如果一个事务正在进行,则会抛出一个异常。 PROPAGATION_NOT_SUPPORTED 表示该方法不应该在一个事务中运行。如果一个现有事务正在进行中,它将在该方法的运行期间被挂起。 PROPAGATION_SUPPORTS 表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行。 PROPAGATION_REQUIRES_NEW 表示当前方法必须在它自己的事务里运行。一个新的事务将被启动,而且如果有一个现有事务在运行的话

Spring事务中的隔离级别

跟風遠走 提交于 2020-01-04 01:34:25
TransactionDefinition接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离界别,MySQL默认采用的REPEATABLE_READ隔离级别,Oracle默认采用的READ_COMMITTED隔离级别。 TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读、幻读或不可重复读。 TransactionDefinition.ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。 TransactionDefinition.ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。 TransactionDefinition.ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 来源:

Spring 事务机制详解

社会主义新天地 提交于 2020-01-04 01:32:31
Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考。 Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。 下面分别详细讲解,事务的四种属性,仅供诸位学习参考: Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事务管理的核心接口。 public interface TransactionDefinition { int getPropagationBehavior();//返回事务的传播行为。 int getIsolationLevel();//返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。 int getTimeout();//返回事务必须在多少秒内完成

Spring 事务机制详解

旧巷老猫 提交于 2020-01-04 01:32:06
原文出处: 陶邦仁 Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考。 Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。 下面分别详细讲解,事务的四种属性,仅供诸位学习参考: Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事务管理的核心接口。 1 2 3 4 5 6 public interface TransactionDefinition { int getPropagationBehavior(); //返回事务的传播行为。 int getIsolationLevel(); //返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。 int

Spring的传播行为与隔离级别

天大地大妈咪最大 提交于 2020-01-04 01:31:29
Spring事务中的传播行为如下: Require:支持当前事务,如果没有事务,就建一个新的,这是最常见的; Supports:支持当前事务,如果当前没有事务,就以非事务方式执行; Mandatory:支持当前事务,如果当前没有事务,就抛出异常; RequiresNew:新建事务,如果当前存在事务,把当前事务挂起; NotSupported:以非事务方式执行操作,如果当前存在事务,就把事务挂起; Never:以非事务方式执行,如果当前存在事务,则抛出异常。 Nested:新建事务,如果当前存在事务,把当前事务挂起。与RequireNew的区别是与父事务相关,且有一个savepoint。 其中,Require、Supports、NotSupported、Never两个看文字也就能了解,就不多说了。而Mandatory是要求所有的操作必须在一个事务里,较Require来说,对事务要求的更加严格。 RequireNew:当一个Require方法A调用RequireNew方法B时,B方法会新new一个事务,并且这个事务和A事务没有关系,也就是说B方法出现异常,不会导致A的回滚,同理当B已提交,A再出现异常,B也不会回滚。 Nested:这个和RequireNew的区别是B方法的事务和A方法的事务是相关的。只有在A事务提交的时候,B事务都会提交。也就是说当A发生异常时,A、B事务都回滚

事务的传播行为和隔离级别

吃可爱长大的小学妹 提交于 2020-01-04 01:31:10
事务使用步骤如下: 步骤一、在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 步骤二、具有@Transactional 注解的bean自动配置为声明式事务支持 <!-- 事务管理器配置, Hibernate单数据源事务 --> <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3