小编Bri*_*ian的帖子

(NOLOCK) VS NOLOCK

当我看到一个看起来像这样的查询时,我正在调查一些阻塞:

SELECT SomeField FROM SomeTable NOLOCK
Run Code Online (Sandbox Code Playgroud)

我看到了NOLOCK并且很好奇它是如何阻塞其他查询的,在这种情况下是DELETE语句。我快速查看了使用的锁sp_lock,这是我所看到的:

DB      S   GRANT

TAB     IS  GRANT

PAG    S    GRANT
Run Code Online (Sandbox Code Playgroud)

现在,我的理解是NOLOCK应该只需要一个 Schema-Stability 锁,为什么它会抓住一个 IS 锁?

我的好奇心被勾起来了。我查看了 BOL,发现有两种使用方法,WITH (NOLOCK)以及已弃用的 . (NOLOCK),所以我决定尝试一下。我运行了以下查询,然后运行sp_lock

SELECT SomeField FROM SomeTable WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
DB S 赠款

TAB Sch-S 授权
SELECT SomeField FROM SomeTable (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
DB S 赠款

TAB Sch-S 授权

果然,有我的模式稳定性锁。所以我的问题是:这里发生了什么?如果使用 NOLOCK 的公认语法是WITH (NOLOCK)or (NOLOCK),那么为什么查询在只使用普通NOLOCK(不带括号)运行时不会出错?如果支持,为什么要抢 IS 锁?我在这里缺少什么?我一直在网上搜索答案,但到目前为止还不够。

我已经在 2008R2 和 2012 上对此进行了测试。

sql-server syntax nolock

24
推荐指数
1
解决办法
4014
查看次数

标签 统计

nolock ×1

sql-server ×1

syntax ×1