数据库的隔离性是数据库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.总结
如下图所示:
分享到:
相关推荐
数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏...
通过此文档,让你完全了解数据库事务与隔离技术,SQL SERVER,ORACLE在不同事务隔离级别的区别,以及两种数据库本身的特点
之前的文章mysql锁机制详解中我们详细讲解了innodb的锁机制,锁机制是用来保证在并发情况下数据的准确性,而要保证数据准确通常需要事务的支持,而mysql存储引擎innodb是通过锁机制来巧妙地实现事务的隔离特性中的4...
MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用–transaction-isolation选项...
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID) 1、原子性(Atomicity):事务开始后所有操作,要么全部做... 3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据
1、事务具有ACID特性 ...2、事务的隔离级别 1)隔离级别的定义与问题 READ UNCOMMITTED(读未提交):事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为
检查当前默认的隔离级别别,可以发现都是 Repeatable Read –可重复读-(在当前事务内,重复读取第一次读取过的数据就叫可重复读。) 3、修改A端的隔离级别为readuncommitted –读未提交。意思是可以读取别人没有...
当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一。 1.2为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点DQL(select),DML(insert,update,delete)...
MySQL从入门到高级面试详解大全,从入门到进阶 包含:《MYSQL入门经典习课后题答案.doc》《MySQL从入门到高级面试详解大全.》 、数据库基础知识 ...三、事务隔离级别和移动通信控制中心 >四、MySQL调优
18.4.3 设置隔离级别实现并发控制 18.4.4 死锁及其预防 18.5 Oracle中的并发事务控制 18.5.1 通过加锁避免写数据丢失 18.5.2 设置只读事务(READ ONLY) 18.5.3 Oracle中的隔离级别 第19章 嵌入式SQL...
前言 ...如果是Django2.0以下的版本,需要去修改到这个隔离级别,不然乐观锁操作时无法读取已经被修改的数据 RepeatableRead(可重读) 这是这是Mysql默认的隔离级别,可以到mysql的配置文件中去修改;
Spring 事务隔离与事务传播的详解与对比 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中...
21.3 数据库的事务隔离级别 21.3.1 在mysql.exe程序中设置隔离级别 21.3.2 在应用程序中设置隔离级别 21.4 在应用程序中采用悲观锁 21.4.1 利用数据库系统的独占锁来实现悲观锁 21.4.2 由应用程序实现...
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 无参无返回值...
oMySql隔离级别和锁机制详解 MySql锁 性能 o乐观锁 o悲观锁 操作 o读锁 o写锁 粒度 o表锁 o行锁 其他 o间隙锁 o临建锁 死锁优化解决方案 事务隔离级别 读未提交 读已提交 可重复读
第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 ...
l lower_case_table_names Linux或类Unix平台,对文件名称大小写敏感,也即对数据库、表、存储过程等对象名称大小写敏 感,为减少开发人员的开发成本,为此推荐大家设置该参数使对象名称都自动转换成小写;...
锁定数据库的一个表 代码如下:SELECT * FROM table WITH (HOLDLOCK)注意: 锁定数据库的一个表的区别 代码如下:SELECT * FROM table WITH (HOLDLOCK)其他事务可以读取表,但不能更新删除 代码如下:SELECT * FROM ...