pen*_*ake 1 sql t-sql sql-server locking
想象一下,foo我的数据库中有一个表,每隔几毫秒,我INSERTING就是这个表的新行.
运行以下查询时:
SELECT *
From foo
WITH(NOLOCK)
Run Code Online (Sandbox Code Playgroud)
随着表不断扩展,SQL server当我运行没有锁定的查询时,如何决定在搜索结果中获取该表的行数?
是未指定的行为.NOLOCK可以返回所有行,根本不返回任何行(是的,它可以!),它可能会遗漏一些行,并且它可以返回重复的行.从字面上看,所有案例都是可能的.实际上,如果表经历了更改(INSERTS),很可能会得到一些丢失的行和一些具有很高概率的重复行.解释与nolock查询扫描数据的方式(按分配顺序)以及数据修改如何移动数据(b-tree上的页面拆分,堆上的行向前)有关.这些数据移动可以在当前扫描点之前或之后移动数据,这将导致数据被省略(丢失,当在读取之前移动到当前扫描点之后)或数据被复制时(在移动到当前扫描点之前)它被阅读一次,甚至两次).
如果使用NOLOCK提示进行更详细的讨论,请参阅以前提交的行.