EXISTS查询是否仍会锁定表格?

sco*_*ttm 1 sql-server sql-server-2000

IF NOT EXISTS(SELECT * FROM MyTable WITH(nolock) WHERE Key = 'MyKey')
  INSERT MyTable(Key) Values('MyKey')
Run Code Online (Sandbox Code Playgroud)

如果表中不存在该值,查询是否会获取锁定?

Gre*_*ech 6

来自文档:

READUNCOMMITTED和NOLOCK提示仅适用于数据锁.所有查询(包括具有READUNCOMMITTED和NOLOCK提示的查询)在编译和执行期间都会获取Sch-S(模式稳定性)锁.因此,当并发​​事务在表上持有Sch-M(模式修改)锁时,将阻止查询.例如,数据定义语言(DDL)操作在修改表的模式信息之前获取Sch-M锁.尝试获取Sch-S锁时,任何并发查询(包括使用READUNCOMMITTED或NOLOCK提示的查询)都会被阻止.相反,持有Sch-S锁的查询会阻止尝试获取Sch-M锁的并发事务.有关锁定行为的详细信息,请参阅锁定兼容性(数据库引擎).

因此它不会获取数据锁,但它仍将获得模式稳定性锁.

  • 作为旁注,在进行插入之前检查行的存在时,使用锁定提示非常狡猾.如果您的事务隔离级别不是READ UNCOMMITTED,那么您基于在当前事务的上下文中不一定正确的查询进行插入,因此如果两个查询尝试插入,您可能会收到错误同一记录. (4认同)