已提交读隔离下的缺失行

Ale*_*min 7 sql-server concurrency isolation-level

众所周知,Read Committed 隔离容易出现不同的异常。我阅读了伟大的保罗怀特关于隔离级别的系列。与讨论相关的帖子是这个:

它声明(再次,这是众所周知的),在读提交隔离下运行的语句:

Can encounter the same row multiple times;
Can miss some rows completely;
Run Code Online (Sandbox Code Playgroud)

我的问题是关于“缺失行”部分。讨论缺失行的示例通常使用以下查询来演示问题:

select count(*) from table.

我的问题是在“常规”选择查询中可以遗漏行吗?意思是,可以像这样的查询

select * from table

甚至

select * from table where id = @id

还会错过在该查询开始之前提交的行吗?此问题仅适用于使用锁定(而非 RCSI)提交的读取,因为 RCSI 不允许这些类型的异常。

Dan*_*man 11

SELECT查询开始之前提交的行可能会丢失的情况是更新索引键值时。考虑这个查询:

SELECT * FROM dbo.YourTable;
Run Code Online (Sandbox Code Playgroud)

执行计划可能会执行有序的集群扫描以返回所有列。如果在扫描过程中更新并提交了某个键值,并且新值小于更新时的有序扫描点,则不会返回该行。

有了这个查询:

SELECT * FROM dbo.YourTable WHERE id = @id;
Run Code Online (Sandbox Code Playgroud)

如果id是主键并且使用了单例搜索,则不会丢失该行。但是在扫描期间更新和提交键值的非唯一索引的查找/扫描的情况下,根据更新时间的扫描点可能会或可能不会返回行。