当我看到类似以下查询的查询时,我正在调查一些阻塞:
SELECT SomeField FROM SomeTable NOLOCK
我看到了,NOLOCK
并且很好奇它如何阻止其他查询(在本例中为DELETE
语句)。我快速浏览了使用的锁sp_lock
,这是我看到的内容:
DB S GRANT
TAB IS GRANT
PAG S GRANT
现在,我的理解是NOLOCK
应该只获取一个Schema-Stability锁,为什么它随后会获取IS锁?
我的好奇心激起了。我查看了BOL,发现有两种使用方法,WITH (NOLOCK)
并且已经过时了(NOLOCK)
,所以我决定尝试一下。我运行以下查询,随后运行sp_lock
:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S授权 TAB Sch-S GRANT
SELECT SomeField FROM SomeTable (NOLOCK)
DB S授权 TAB Sch-S GRANT
果然,这里有我的架构稳定性锁。所以我的问题是:这是怎么回事?如果使用NOLOCK的可接受语法是WITH (NOLOCK)
或(NOLOCK)
,那么为什么仅使用普通NOLOCK
字符(不带括号)运行查询时却不会出现查询错误?如果支持,为什么要抓住IS锁?我在这里想念什么?我一直在网上寻找答案,但到目前为止还很短。
我已经在2008R2和2012上对此进行了测试。
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
对于双重诺洛克效应;)