在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(提交讀)或以上,也就是只能讀取已提交的資料來避免髒讀的情況。
沒有留言:
張貼留言