(NOLOCK)与NOLOCK
当我看到类似以下查询的查询时,我正在调查一些阻塞: 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上对此进行了测试。