众所周知,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
可能会丢失的情况是更新索引键值时。考虑这个查询:执行计划可能会执行有序集群扫描以返回所有列。如果在扫描期间更新并提交了一个键值,并且新值小于更新时的有序扫描点,则不会返回该行。
使用此查询:
id
如果是主键并且使用单例搜索,则不会错过该行。但是在非唯一索引的查找/扫描的情况下,在扫描期间更新和提交键值,根据更新时间的扫描点,可能会或可能不会返回该行。