当我看到一个看起来像这样的查询时,我正在调查一些阻塞:
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 上对此进行了测试。
意味着您刚刚使用了别名
SomeTable AS NOLOCK
。请尝试以下操作以清楚地看到这一点:这显然对查询的锁定行为没有影响。查询不会失败,因为尽管在 SSMS 中是关键字 & 显示为蓝色,但 NOLOCK 不是 Transact-SQL 中的保留字,因此不会导致语法错误。保留字列表:https ://msdn.microsoft.com/en-us/library/ms189822.aspx
用作提示的正确语法:
(NOLOCK)
有效但已弃用。WITH (NOLOCK)
是推荐的语法。