ANSI SQL standard (1992) 定義了 Transaction Isolation 的等級,等級的劃分依據執行中,其他Transactions對於原本Transaction所使用的資料可進行甚麼類型的讀取。類型分為:
- Dirty read: 可讀取尚未commited的資料。
- Nonrepeatable read: 不同時間讀取同列的資料得到的值不同,代表發生了修改或刪除,這樣的讀取被允許。
- Phantom read: 相同的範圍操作query在不同時間點執行,但結果不一樣,這樣的讀取被允許。
基於上述類型,ANSI將Isolation等級由寬鬆到嚴格分為:
Read Uncommited
允許:
- Dirty read
- Nonrepeatable read
- Phantom read
Transaction進行中不施加任何鎖,因此也增加Consistency的成本。
Read Commited
允許:
- Nonrepeatable read
- Phantom read
通常Transaction在commit前使用Exclusive lock,保護修改的資料。
Repeatable Read
允許:
- Phantom read
通常Transaction使用Shared lock,避免其他Transaction進行修改,不過重複讀取相同query可能會有新的資料列。
Serilizable
皆不允許Dirty read、Nonrepeatable read以及Phantom read。
另外一些商用資料庫有實現自己的Isolation等級,如 Read Only/Snapshot,Transaction將操作自行複製的資料,進行完整的隔離。