

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 隔離層級的定義
<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) 允許另一種隔離，即 *SNAPSHOT* 隔離。這保證在交易開始時，交易可在存在之資料的快照上操作，而且其他交易都不能變更該快照。