Sql-Server
已送出讀隔離下的缺失行
眾所周知,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
如果是主鍵並且使用單例搜尋,則不會錯過該行。但是在非唯一索引的查找/掃描的情況下,在掃描期間更新和送出鍵值,根據更新時間的掃描點,可能會或可能不會返回該行。