数据库事务

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

数据库传播级别和隔离级别详解(转载)

≯℡__Kan透↙ 提交于 2020-01-04 01:29:40
事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题。 事务最重要的两个特性,是事务的传播级别和数据隔离级别。传播级别定义的是事务的控制范围,事务隔离级别定义的是事务在数据库读写方面的控制范围。 以下是事务的7种传播级别: 1) PROPAGATION_REQUIRED ,默认的spring事务传播级别,使用该级别的特点是,如果上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行。所以这个级别通常能满足处理大多数的业务场景。 2) PROPAGATION_SUPPORTS ,从字面意思就知道,supports,支持,该传播级别的特点是,如果上下文存在事务,则支持事务加入事务,如果没有事务,则使用非事务的方式执行。所以说,并非所有的包在transactionTemplate.execute中的代码都会有事务支持。这个通常是用来处理那些并非原子性的非核心业务逻辑操作。应用场景较少。 3) PROPAGATION_MANDATORY , 该级别的事务要求上下文中必须要存在事务,否则就会抛出异常!配置该方式的传播级别是有效的控制上下文调用代码遗漏添加事务控制的保证手段。比如一段代码不能单独被调用执行,但是一旦被调用,就必须有事务包含的情况,就可以使用这个传播级别。 4) PROPAGATION

实训笔记

烈酒焚心 提交于 2020-01-04 01:29:24
1.@Aspect 1 package com.tianque.project.recruit.aspect; 2 3 import com.tianque.project.core.thread.ThreadVariable; 4 import com.tianque.project.recruit.domain.RecruitUserDetail; 5 import org.aspectj.lang.annotation.Aspect; 6 import org.aspectj.lang.annotation.Before; 7 import org.slf4j.Logger; 8 import org.slf4j.LoggerFactory; 9 import org.springframework.stereotype.Repository; 10 11 import java.lang.reflect.InvocationTargetException; 12 import java.lang.reflect.Method; 13 import java.util.Date; 14 15 16 @Aspect 17 @Repository("recruitAspect") 18 public class RecruitAspect { 19 private final

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

核能气质少年 提交于 2020-01-04 01:28:48
事物注解方式: @Transactional 【一】传播行为: 使用方法: @Transactional(propagation=Propagation.REQUIRED) Require:支持当前事务,如果没有事务,就建一个新的,这是最常见的; Supports:支持当前事务,如果当前没有事务,就以非事务方式执行; Mandatory:支持当前事务,如果当前没有事务,就抛出异常; RequiresNew:新建事务,如果当前存在事务,把当前事务挂起,先执行新的在执行旧的; NotSupported:容器不为这个方法开启事务。 Never:以非事务方式执行,如果当前存在事务,则抛出异常。 Nested:新建事务,如果当前存在事务,把当前事务挂起。与RequireNew的区别是与父事务相关,且有一个savepoint。 【二】隔离级别: 先上一张图:    1、事务的隔离级别:是为了使你在性能与数据的有效性之间做一个平衡,不是说级别越高越好,只有合适才是最好的。   多用于处理多事务的并发问题,并行可以提高数据库的吞吐量和效率。 使用方法: @Transactional(isolation = Isolation.SERIALIZABLE)   Serializable(串行化 )。最严格的级别,事务串行执行,资源消耗最大;   Repeatable Read(可重复读)。