`
chong_zh
  • 浏览: 70149 次
  • 来自: 杭州
社区版块
存档分类
最新评论

数据库隔离级别详解

 
阅读更多
数据库的隔离性是数据库ACID保证中的重要组成部分。应当区分开原子性与隔离性的不同含义,为了实现原子性有悲观/乐观的两种并发控制策略,在原子性的基础上,实现隔离性,既可以使用悲观的并发控制策略,也可以使用乐观的并发控制策略。

不同的应用场景会对数据库隔离性有不同的要求,越高的隔离性可以越高程度的保证数据的一致性,但是会带来越多的性能开销。反之,降低隔离性要求将会牺牲一些数据一致性,但是可以提供数据库的性能。选择数据库的一致性应当从应用的逻辑要求出发,选择满足数据逻辑要求的最低隔离级别。

本文以数据库技术中的Read Phenomenon(读取现象)为线索,详细解释了ANSI SQL标准中定义的隔离级别。


1. Dirty Read(脏读)现象
所谓脏读,是指两个并发的事务,其中一个读到了另一个还未提交的数据。如下图所示,如果Transaction1读到了Transaction2还未提交的数据,就称作脏读。

会发生脏读的数据库所处的隔离级别,被称作Read Uncommitted。如果应用场景有需求,需要避免脏读,则需要提高隔离级别。消除脏读的策略是显然的,即:未提交的事务所做的数据修改应当写到Buffer中,而不应当让别的事务可见。消除了咱幅度现象后数据库所处的隔离级别就升级到了Read Committed


2.无法重复读(Non-repeatable reads)现象
所谓无法重复读,是指在一个事务执行的过程中,进行了两次同一数据的读取操作,但是执行的结果却不同。如下图所示,Tansaction1在执行过程中,进行了两次相同的读,但是由于Transaction2修改了数据,Transaction1进行的两次读的结果将会是不同的。

会发生无法重复读现象的数据库所处的隔离级别,被称作Read Committed。如果应用场景有需求,需要避免无法重复读,则需要提高隔离级别。消除无法重复读的常见策略有两种:
  • 1,SerializeTrans:推迟Tran2的执行,直到Tran1提交或回滚
  • 2,multiversion concurrency control:允许Tran2提交,Tran1则Buffer第一次操作后得到的数据Snapshot中继续操作

如果使用了上述策略1,则数据库的隔离级别就升级到了最高隔离级别Serializable。如果使用了上述策略2,则无法重复读现象可以消除,单数数据库还是会存在幻影读现象,此时数据库所处的隔离级别被称作Repeatable Read


3.幻影读(Phantom reads)现象
所谓幻影读,是指在一个事务执行的过程中,进行了两次相同的SELECT操作,但是返回的结果集合却不同。如下图所示,Tran1的两次SELECT操作的返回行集不同。

为了避免幻影读现象,需要对所谓Range Operation进行加锁。在上图的例子中,即对范围[Age:10 ~ 30]进行加锁,任何对这个范围内的行操作都需要等待。消除了幻影读,数据库就升级到最高隔离级别Serializable


4.总结
如下图所示:


分享到:
评论

相关推荐

    MySQL数据库事务隔离级别详解

    数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏...

    数据库事务与隔离技术

    通过此文档,让你完全了解数据库事务与隔离技术,SQL SERVER,ORACLE在不同事务隔离级别的区别,以及两种数据库本身的特点

    innodb如何巧妙的实现事务隔离级别详解

    之前的文章mysql锁机制详解中我们详细讲解了innodb的锁机制,锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而mysql存储引擎innodb是通过锁机制来巧妙地实现事务的隔离特性中的4...

    MySQL 四种事务隔离级别详解及对比

    MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用–transaction-isolation选项...

    MySQL四种事务隔离级别详解

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)  1、原子性(Atomicity):事务开始后所有操作,要么全部做... 3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据

    MySQL事务及Spring隔离级别实现原理详解

    1、事务具有ACID特性 ...2、事务的隔离级别 1)隔离级别的定义与问题 READ UNCOMMITTED(读未提交):事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为

    mysql 详解隔离级别操作过程(cmd)

    检查当前默认的隔离级别别,可以发现都是 Repeatable Read –可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。) 3、修改A端的隔离级别为readuncommitted –读未提交。意思是可以读取别人没有...

    开发人员为什么必须要了解数据库锁详解

    当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一。 1.2为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点DQL(select),DML(insert,update,delete)...

    MySQL从入门到高级,进阶详解

    MySQL从入门到高级面试详解大全,从入门到进阶 包含:《MYSQL入门经典习课后题答案.doc》《MySQL从入门到高级面试详解大全.》 、数据库基础知识 ...三、事务隔离级别和移动通信控制中心 >四、MySQL调优

    精通SQL 结构化查询语言详解

    18.4.3 设置隔离级别实现并发控制 18.4.4 死锁及其预防  18.5 Oracle中的并发事务控制  18.5.1 通过加锁避免写数据丢失 18.5.2 设置只读事务(READ ONLY)  18.5.3 Oracle中的隔离级别  第19章 嵌入式SQL...

    基于Django的乐观锁与悲观锁解决订单并发问题详解

    前言 ...如果是Django2.0以下的版本,需要去修改到这个隔离级别,不然乐观锁操作时无法读取已经被修改的数据 RepeatableRead(可重读) 这是这是Mysql默认的隔离级别,可以到mysql的配置文件中去修改;

    Spring 事务隔离与事务传播的详解与对比

    Spring 事务隔离与事务传播的详解与对比 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     21.3 数据库的事务隔离级别  21.3.1 在mysql.exe程序中设置隔离级别  21.3.2 在应用程序中设置隔离级别  21.4 在应用程序中采用悲观锁  21.4.1 利用数据库系统的独占锁来实现悲观锁  21.4.2 由应用程序实现...

    Java_JDBC由浅入深

    8.6 数据库的隔离级别介绍 56 8.6.1 未提交读 57 8.6.2 提交读 58 8.6.3 重复读 59 8.6.4 序列化读 60 8.7 小结 62 第九节 PreparedStatement接口的使用 62 第十节 CallableStatement接口的使用 62 9.1 无参无返回值...

    MySQL详解视频.zip

    oMySql隔离级别和锁机制详解 MySql锁 性能 o乐观锁 o悲观锁 操作 o读锁 o写锁 粒度 o表锁 o行锁 其他 o间隙锁 o临建锁 死锁优化解决方案 事务隔离级别 读未提交 读已提交 可重复读 

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    MySQL数据库服务器端核心参数详解和推荐配置

    l lower_case_table_names Linux或类Unix平台,对文件名称大小写敏感,也即对数据库、表、存储过程等对象名称大小写敏 感,为减少开发人员的开发成本,为此推荐大家设置该参数使对象名称都自动转换成小写;...

    sqlserver2008锁表语句详解(锁定数据库一个表)

    锁定数据库的一个表 代码如下:SELECT * FROM table WITH (HOLDLOCK)注意: 锁定数据库的一个表的区别 代码如下:SELECT * FROM table WITH (HOLDLOCK)其他事务可以读取表,但不能更新删除 代码如下:SELECT * FROM ...

Global site tag (gtag.js) - Google Analytics