DBMS 的 Transaction Isolation ANSI 等級


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將操作自行複製的資料,進行完整的隔離。

dbms 

See also