在ANSI SQL-92的4.28 SQL-transactions中提到的併發交易(concurrent transaction)隔離的不重覆讀(non-repeatable read)現象。
併發交易的隔離層級(isolation level)是指「當一筆資料同時被多個交易存取的隔離程度」。
不重覆讀是指「:T1交易讀取一筆資料,接著T2交易修改該筆資料且提交,然後T1再重讀該筆資料發現被修改了」。換句話說就是「同一筆交易中的兩次查詢的結果不同」的現象。要再強調一次是
ANSI SQL-92原文如下:
P2 ("Non-repeatable read"): SQL-transaction T1 reads a row. SQL-transaction T2 then modifies or deletes that row and performs a COMMIT. If T1 then attempts to reread the row, it may receive the modified value or discover that the row has been deleted.
以圖示說明如下,由上而下代表時間經過。T1查詢一筆資料,T2交易更新該筆資料,然後T1又查詢同一筆資料,導致T1第兩次查詢的結果不同。此即為不重覆讀。
T1 T2
| |
READ |
| MODIFY
| |
| COMMIT
READ |
| |
v v
non-repeatable reads
當交易的隔離層級為READ UNCOMMITTED(未提交讀)或READ_COMMITTED(提交讀)時會發生不重覆讀現象。現今主流資料庫(Oracle , MySQL(InnoDB), SQL Server, PostgreSQL, MariaDB)預設的隔離層級多為READ COMMITTED(提交讀)或以上。
沒有留言:
張貼留言