(NOLOCK)与NOLOCK


24

当我看到类似以下查询的查询时,我正在调查一些阻塞:

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上对此进行了测试。


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)对于双重诺洛克效应;)
ypercubeᵀᴹ17年

Answers:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

表示您只是别名SomeTable AS NOLOCK。请尝试以下操作,以清楚地看到这一点:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

显然,这对查询的锁定行为没有影响。查询不会失败,因为尽管在SSMS中它是关键字并显示为蓝色,但NOLOCK 在Transact-SQL中不是保留字,因此不会引起语法错误。保留字列表:https : //msdn.microsoft.com/en-us/library/ms189822.aspx

用作提示的正确语法:

  • (NOLOCK) 有效,但已弃用。
  • WITH (NOLOCK) 是推荐的语法。

14
哇,不确定我怎么没弄清楚。这真的使我发疯,现在我感到很尴尬:)我想有时候这是最简单的事情。
布莱恩(Brian)

2
@Brian不用担心,最近我不得不调试一些非常相似的东西,否则可能很难发现!您可以看到为什么MS不赞成使用该语法。
加雷斯·里昂斯

NOLOCK不是保留关键字吗?如果您不使用[NOLOCK],它应该不会抱怨吗?
Aaroninus

6
Nope msdn.microsoft.com/zh-cn/library/ms189822.aspx尽管它在SSMS中的确显示为蓝色,但可能会使您失望。
加雷斯·里昂斯

很好,哈哈。我今天最喜欢的问答
RBarryYoung '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.