網頁

2020/12/9

資料庫 SQL交易隔離 髒讀 SQL transaction isolation dirty read

ANSI SQL-92的4.28 SQL-transactions中提到的併發交易(concurrent transaction)隔離的髒讀(dirty read)現象。

併發交易的隔離層級(isolation level)是指「當一筆資料同時被多個交易存取的隔離程度」。

髒讀是指「T1交易更新一筆資料但未提交,同時T2交易可讀取該筆T1更新但尚未提交的資料,如果T1 rollback了,則T2讀取的資料就是錯的」。換句話說就是「一筆交易讀取到另筆交易未提交的更新資料」的現象。

ANSI SQL-92原文如下:

P1 ("Dirty read"): SQL-transaction T1 modifies a row. SQL- transaction T2 then reads that row before T1 performs a COMMIT. If T1 then performs a ROLLBACK, T2 will have read a row that was never committed and that may thus be considered to have never existed.


以圖示說明如下,由上而下代表時間經過。T1交易更新一筆資料尚未提交,T2交易讀取該筆T1更新但未提交的資料,然後T2回滾原本的更新,導致T1讀取的更新資料是錯的,此即為髒讀,也就是讀到髒的資料。

T1          T2
 |           |
MODIFY       |
 |           |
 |          READ
 |           |
ROLLBACK     |
 |           |
 v           v
            dirty read

當交易的隔離層級為READ UNCOMMITTED(未提交讀)時會發生髒讀的現象。不過現今主流資料庫(Oracle , MySQL(InnoDB), SQL Server, PostgreSQL, MariaDB)預設的隔離層級多為READ COMMITTED(提交讀)或以上,也就是只能讀取已提交的資料來避免髒讀的情況。


沒有留言:

張貼留言