疑难杂症--单回话下 WITH(NOLOCK)返回更多数据

时间:2024-09-17 11:34:38

​场景:
某DBA在一个人操作数据库时发现,可提交读事务隔离级别下返回的数据少于未提交读事务隔离级别,确认没有其他事务修改数据。

解决方案1:

将数据查询放入一个新建的表,使用该表查询发现问题被消除。

解决方案2:
运行DBCC CHECKDB,发现 3 个分配错误和 21756 个一致性错误,使用DBCC CHECKDB(REPAIR_REBUILD)来修复

问题原因:
在未提交读或NOLOCK下,SQL SERVER 使用IAM链来读取所有数据,在普通模式下,SQL SERVER 按照聚集索引的索引链(每个索引页头存放上一页和下一页的文件ID和页ID)来访问所有数据,因此当分配页出现错误时,就会导致该情况