網頁

2020/12/10

資料庫 SQL交易隔離 不重覆讀 SQL transaction isolation non-repeatable read

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(提交讀)或以上。


沒有留言:

張貼留言