事务隔离级别

一文讲透数据库事务四原则

别来无恙 提交于 2020-01-04 08:23:22
本文始发于个人公众号: TechFlow 说到数据库,以前我老师有一句很经典的话。你可以不会写SQL,但是一定不能不知道 ACID 。 在工业领域,SQL可以说是应用最广泛的技术。从后端到算法,从数据到DBA,再到产品,甚至连一些运营也会基本的SQL。所以如果你现在还不太会的话,我建议你用一个下午的时间找个网站好好学一下。 原本我是想直接写些Hbase相关的内容,但是我发现要想讲清楚Hbase,必须要讲noSQL数据库。如果将noSQL,则又离不开最传统的关系型数据库。所以我们一步一步来,先从基础的关系型数据库讲起。或许我这么说并不准确,因为数据库并不基础,相反它十分复杂。从索引到各种优化和设计原理,再到内部的各种算法和数据结构,涉及到的内容非常多。我们先把浩如烟海的知识放一放,先从最核心的数据库四大原则开始说起。 数据库事务ACID四大原则, A代表Atomicity,即原子性。C表示Consistency,即一致性。I表示Isolation,即隔离性。D表示Durability,即持久性 。 这四个原则了解过数据库的应该都如雷贯耳。可是真正面试的时候被问起来,能一个不落说得上来,并且讲得清楚原委的就不多了。我觉得主要是因为我们的翻译过于文雅,不像英文那么直观,所以很难顾名思义。另一个原因是我们在学习的时候理解不够深入,只知道原因,不知道原因的究竟。所谓知其然,不知其所以然。

Spring事务的隔离级别

柔情痞子 提交于 2020-01-04 03:24:50
Spring事务的隔离级别 1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应。 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 什么是脏数据,脏读,不可重复读,幻觉读? 脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据

数据库事务隔离级别及传播行为

杀马特。学长 韩版系。学妹 提交于 2020-01-04 03:23:00
一、隔离级别: 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted、 Read committed、 Repeatable read、 Serializable,这四个级别可以逐个解决 脏读、 不可重复读、 幻读这几类问题。 1. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。 2. ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 3. ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 4. ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。 我们使用 test 数据库,新建 tx 表:---MySQL数据库 第1级别:Read Uncommitted(读取未提交内容) (1)所有事务都可以看到其他未提交事务的执行结果 (2)本隔离级别很少用于实际应用

浅谈Spring事务隔离级别

↘锁芯ラ 提交于 2020-01-04 03:18:02
一、Propagation (事务的传播属性) Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用: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

mysql事务隔离级别及传播机制

跟風遠走 提交于 2020-01-04 03:16:44
TRANSACTION(事务隔离级别) 在说明事务隔离级别之前先说一下 脏读 、 不可重复读 、 幻读 这三个概念。 脏读: 一个事务读取到另一事务未提交的更新新据。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有 提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另 外一个事务读到的这个数据是脏数据,依据脏数据所做的操作也可能是不正确的。 不可重复读: 在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的 更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务 已提交的更新数据。 幻读: 事务T1执行一次查询,然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用的查询的条件。然后T1又使用相同 的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然 出现的一样。 1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。 每种数据库的默认隔离级别是不同的,例如SQL Server、Oracle默认Read Commited

关于事务的传播特性和隔离级别的问题

断了今生、忘了曾经 提交于 2020-01-04 03:12:32
REQUIRED:业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。 NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。 REQUIRESNEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。 MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出例外。 SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。 Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点

springMVC+mybatis事务管理总结

这一生的挚爱 提交于 2020-01-04 02:52:42
1.spring,mybatis事务管理配置与@Transactional注解使用: 概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects) 支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理API 与spring数据访问抽象的完美集成 事务管理方式 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码

4种事务特性,5种隔离级别,7种传播行为

ⅰ亾dé卋堺 提交于 2020-01-04 01:41:39
什么是事务? 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (consistency):事务的执行的前后数据的完整性保持一致. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰 持久性(durability) :事务一旦结束,数据就持久到数据库 如果不考虑隔离性引发安全性问题: 脏读 :一个事务读到了另一个事务的未提交的数据 不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致. (针对某条记录,两次查询不一致) 虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.(针对某张表,两次查询到条数不一致,查到了多的数据) 事务隔离级别(5种) DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生 已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生 可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生. 串行化的 (serializable)

事务的传播机制

谁说我不能喝 提交于 2020-01-04 01:40:34
1.什么是事务:   事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。   数据库向用户提供保存当前程序状态的方法,叫 事务提交 (commit ) ;当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫 事务回滚( rollback ) 2.事务的传播机制   以spring的事务传播机制为例子:   Spring事务机制主要包括 声明式事务 和 编程式事务 ,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考。   Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。    spring在TransactionDefinition接口中定义了七个事务传播行为: propagation_requierd :如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择

oracle事务

半城伤御伤魂 提交于 2020-01-04 01:39:47
事务定义: (1)原子性:要么执行完成,要么不执行。 (2)一致性:业务逻辑一致性。例如:业务逻辑为,A表新增一条数据,B表需要更新一条数据,这两个操作需要都执行或者都不执行,就是一致性。此时,可以用@Transactional注解实现 (3)隔离性:多线程需要考虑隔离性,即线程1和线程2需要修改同一个表数据时,其中一个线程看到的要么是另一个线程执行完成或者未执行的结果,不会看到中间数据。 (4)永久性:事务一旦提交,则持久化保存在数据库中。 隔离级别 声明式事务的第二个方面是隔离级别。隔离级别定义一个事务可能受其他并发事务活动活动影响的程度。另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度。 在一个典型的应用程序中,多个事务同时运行,经常会为了完成他们的工作而操作同一个数据。并发虽然是必需的,但是会导致一下问题: 脏读(Dirty read)-- 脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的。 不可重复读(Nonrepeatable read)-- 不可重复读发生在一个事务执行相同的查询两次或两次以上,但每次查询结果都不相同时。这通常是由于另一个并发事务在两次查询之间更新了数据。 幻影读(Phantom reads)-- 幻影读和不可重复读相似。当一个事务(T1