关于NOLOCK提示风险场景及额外潜在问题的技术问询
关于NOLOCK提示风险场景及额外潜在问题的技术问询
我已经仔细研究过两篇讨论SQL Server中NOLOCK提示的内容,现在想请教大家:哪些具体情况会让NOLOCK变得有风险?
- 跨页存储的大记录:当单条记录包含大量字段,或是使用了
varchar(max)、nvarchar(max)、varbinary(max)、xml、text、ntext、image这类大对象字段时,记录可能会跨多个数据页存储,这种场景下使用NOLOCK很容易出问题。 - 非聚集索引的主键查找操作:通过非聚集索引来查找主键的操作,搭配
NOLOCK提示也存在风险。 - 读取已回滚事务的脏数据:如果读取的记录刚好属于一个后续被回滚的事务,
NOLOCK会让你读到这个已经被撤销的脏数据。 - 数据库维护引发的数据移动错误:数据库在执行维护操作(比如索引重建、数据压缩等)时会发生数据移动,此时使用
NOLOCK可能会触发各类错误。 - 可变宽度字段更新导致页移动:如果更新可变宽度字段后,记录需要迁移到新的数据页,这种跨页的数据移动会引发
Error 601:无法使用NOLOCK继续扫描,因为SQL Server发生了数据移动的错误。
上面提到的第1、2种情况,其实就是大家常说的「撕裂读(torn reads)」场景。
除此之外,还有哪些情况会导致NOLOCK返回部分不完整或是完全错误的记录呢?
备注:内容来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

