数据库隔离级别详解

数据库的隔离性是数据库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.总结
如下图所示:


猜你喜欢

转载自chong-zh.iteye.com/blog/2161266
今日推荐