当我看到一个看起来像这样的查询时,我正在调查一些阻塞:
SELECT SomeField FROM SomeTable NOLOCK
我看到了NOLOCK
并且很好奇它如何阻止其他查询,在这种情况下是DELETE
语句。我快速查看了使用的锁sp_lock
,这是我所看到的:
DB S GRANT
TAB IS GRANT
PAG S GRANT
现在,我的理解是它NOLOCK
应该只使用一个模式稳定性锁,为什么它会抓住一个 IS 锁?
我的好奇心被激起了。我查看了 BOL,发现有两种使用方法,WITH (NOLOCK)
以及已弃用的(NOLOCK)
,所以我决定尝试一下。我运行了以下查询,然后运行sp_lock
:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT TAB Sch-S 格兰特
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT TAB Sch-S 格兰特
果然,有我的 Schema-Stability 锁。所以我的问题是:这里发生了什么?如果使用 NOLOCK 的公认语法是WITH (NOLOCK)
or ,那么当它只使用普通(不带括号)(NOLOCK)
运行时,为什么查询不会出错?NOLOCK
如果支持,为什么要抓取 IS 锁?我在这里想念什么?我一直在网上寻找答案,但到目前为止还不够。
我已经在 2008R2 和 2012 上对此进行了测试。