

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 隔离级别定义
<a name="transactions-isolation-levels"></a>

`ACID` 中的“I”代表*隔离*。事务的隔离程度决定了其他并发事务对其所操作的数据的影响程度。

[SQL:1992 标准](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)制定了用于描述隔离级别的词汇表。它定义了两个并发事务 `Tx1` 和 `Tx2` 之间可能发生的三种类型的交互（称为*现象*）：
+ `Dirty read` – 当 `Tx1` 修改某个项目，然后 `Tx2` 在 `Tx1` 提交更改前读取该项目时，将发生这种情况。之后，如果 `Tx1` 始终未成功提交该更改或将其回滚，则 `Tx2` 读取的值从未进入数据库。
+ `Non-repeatable read` – 当 `Tx1` 读取某个项目，然后 `Tx2` 修改或删除该项目并提交更改，随后 `Tx1` 尝试重新读取该项目时，将发生这种情况。此时，`Tx1` 将读取到与以前不同的值，或发现该项目已不存在。
+ `Phantom read` – 当 `Tx1` 读取一组满足搜索条件的项目，然后 `Tx2` 添加一个满足搜索条件的新项目，随后 `Tx1` 重复该搜索时，将发生这种情况。此时，`Tx1` 将获得与之前不同的项目集。

这三种交互类型中的任何一种都可能导致数据库中的最终数据不一致。

SQL:1992 标准定义了四个隔离级别，这些隔离级别在三种交互类型及其可能产生的不一致方面具有不同的保证。在所有四个级别上，都可以保证事务完整执行或根本不执行：
+ `READ UNCOMMITTED` – 允许所有三种交互类型（即脏读、不可重复读以及幻读）。
+ `READ COMMITTED` – 不可能出现脏读，但可能出现不可重复读和幻读。
+ `REPEATABLE READ` – 不可能出现脏读和不可重复读，但仍可能出现幻读。
+ `SERIALIZABLE` – 三种交互现象均不会发生。

多版本并发控制 (MVCC) 允许另一种隔离，即*快照*隔离。这保证事务对事务开始时就存在的数据快照进行操作，并且没有任何其他事务可以更改该快照。