Sql-Server

已送出讀隔離下的缺失行

  • May 14, 2021

眾所周知,Read Committed 隔離容易出現不同的異常。我閱讀了 The Great Paul White 關於隔離級別的系列文章。與討論相關的文章是這個:

它聲明(再次,這是眾所周知的),在讀取送出隔離下執行的語句:

Can encounter the same row multiple times;
Can miss some rows completely;

我的問題是關於“缺失的行”部分。討論失去行的範例通常使用以下查詢來說明問題:

select count(*) from table.

我的問題是*“正常”選擇查詢中的行是否會失去*?意思是,查詢可以像

select * from table

甚至

select * from table where id = @id

還會錯過在該查詢開始之前送出的行嗎?此問題僅適用於使用鎖定(不是 RCSI)送出的讀取,因為 RCSI 不允許這些類型的異常。

在查詢開始之前送出的行SELECT可能會失去的情況是更新索引鍵值時。考慮這個查詢:

SELECT * FROM dbo.YourTable;

執行計劃可能會執行有序集群掃描以返回所有列。如果在掃描期間更新並送出了一個鍵值,並且新值小於更新時的有序掃描點,則不會返回該行。

使用此查詢:

SELECT * FROM dbo.YourTable WHERE id = @id;

id如果是主鍵並且使用單例搜尋,則不會錯過該行。但是在非唯一索引的查找/掃描的情況下,在掃描期間更新和送出鍵值,根據更新時間的掃描點,可能會或可能不會返回該行。

引用自:https://dba.stackexchange.com/questions/285413