資料庫 Isolation Levels

Po-Ching Liu
Jan 12, 2022

在資料庫的交易中,如果交易所操作的是不同資料、不互相依賴,那此交易就可以安全低平行執行。但若兩個交易流程會修改到相同資料,又在高併發的情況下就會造成競爭條件(Race condition)現象(Phenomena)。以下會列出五種交易可能會發生的現象以及四種資料庫所提供的隔離層級。

Race condition Phenomena

Dirty Read

假設一個交易向資料庫寫入資料但還沒有Commit,此時另一個交易如果可以看到尚未提交的資料,那麼這就是dirty read。
如下圖所示,初始在資料庫X=2,當transaction A執行交易,過程中set X=3,在尚未commit前又有另一個transaction B取得X的值,若此時X=3則是為dirty read,因為上筆交易還沒有提交(commit)。

dirty read

Non-repeatable Read (Read Skew)

在同一個交易中重複讀取相同的資料會拿到不一樣的值,就稱為Non-repeatable Read。如下圖所示,當transaction A更新Ben的balance時,在尚未commit前transaction B來讀取,此時會讀到原始的值balance=500(沒有dirty read),在commit後,transaction B又在讀取一次,此時會讀到balance=100,此現象稱為Non-repeatable Read。

Non-repeatable Read (Read Skew)

Lost update

如下圖,在兩個不同的交易同時對Ben的帳戶餘額做扣除,當transaction B覆蓋了transaction A的交易結果,原本預期最後餘額應為100,但最後卻顯示最後Commit的transaction B之交易結果,此狀況稱為lost update。

Lost update

Phantom

幻讀。如下圖,transaction A 在執行第一次select時拿到三筆資料,但當transaction B insert了一筆資料並且提交,transaction A 執行第二次select時與第一次拿到的資料相異(多了transaction B insert的那筆),此現象稱為幻讀。

Phantom

Write Skew

寫入偏斜。如下圖,試想有一個醫院系統希望醫生常態可以有2個以上的人值班,不過當醫生Leo以及Mark碰巧在同一時間都請了假,但因為在交易並未提交的當下皆是符合2個以上on call的規範,因此兩人都請假成功,不過很明顯地有一人是不能請假的,此現象也是race condition的一種,寫入偏斜也可以看做更廣義的Lost update問題。

write skew
V - 可能發生 X - 不會發生 ? - 不一定, 要看資料庫的種類

上表是資料庫中各個隔離級別可能發生的race condition現象,各個層級可預防的race condition有所不同,也會因為資料庫的種類而有所不同。

Isolation Levels

Read Uncommitted Isolation

最低的交易隔離級別,允許讀取其他交易還未Commit的資料,也就是有髒讀(dirty read)的可能與其他現象發生。

Read Committed Isolation

非常流行的交易隔離級別,也是許多資料庫預設的隔離級別。此級別可以預防髒讀,但也還是有其他現象會發生。

Repeatable Read Isolation

可重複讀取級別,也就是說在同一個交易中兩次讀取相同資料會確保相同不受另一個交易所影響。不過各家的資料庫對此層級的定義不盡相同,因此所提供的保證也不盡相同。

Serializable Isolation

最高的隔離級別,他保證資料庫即使在高併發的狀況下,也不會有上述五種現象的發生,就好像併發並不存在,資料庫會確保交易依序被完成,但這也會造成吞吐下降、效能降低。

--

--