網頁

2020/12/6

ANSI SQL-92 SQL-transaction isolation level

資料庫交易的ACID特性中的隔離性(Isolation)定義當一筆資料同時被多個交易存取時產生的影響程度。ANSI SQL-92文件中定義了四種隔離層級(isolation level):

  • READ UNCOMMITTED(未提交讀)
  • READ COMMITTED(提交讀)
  • REPEATABLE READ(可重覆讀)
  • SERIALIZABLE(可序列化)

四種隔離層級為對併發交易(同時間發生多筆交易)造成的三種現象的隔離程度:

  1. P1 ("Dirty read")(髒讀):T1交易更新一筆資料但未提交,同時T2交易可讀取該筆T1更新但尚未提交的資料,如果T1 rollback了,則T2讀取的資料就是錯的。
  2. P2 ("Non-repeatable read")(不重覆讀):T1讀取一筆資料,接著T2修改該筆資料且提交,然後T1再重讀該筆資料發現該筆資料被修改了。
  3. P3 ("Phantom")(幻讀):T1讀取某條件下的一組資料,接著T2新增/刪除一或多筆資料滿足T1的查詢條件,然後T1又重複相同的查詢卻獲得不同的筆數。

下表說明了四種隔離層級對上述三種現象的隔離程度。Y代表可能發生,N則否。

Isolation levels P1
Dirty read
髒讀
P2
Non-repeatable read
不重覆讀
P3
Phantom read
幻讀
READ UNCOMMITTED
未提交讀
Y Y Y
READ COMMITTED
提交讀
N Y Y
REPEATABLE READ
可重覆讀
N N Y
SERIALIZABLE
可序列化
N N N

以上隔離層級在Spring框架分別對映到@Transactional屬性isolation的四種設定。







沒有留言:

張貼留言