sql-server - key 锁实际上锁定了什么资源?

标签 sql-server tsql locking

我知道 key 锁将 key 锁定在索引中。然而,“ key ”到底意味着什么呢?

例如,如果我在姓氏列上有一个非聚集索引并尝试更新姓氏 =“Jones”的位置,那么我是否会有效锁定表中姓氏为“Jones”的每一行?或者索引会被锁定在更高的级别,从而阻止访问姓氏不是“Jones”的行吗?

我问这个问题的原因是在线图书中有关锁定粒度和层次结构的注释:

KEY: A row lock within an index used to protect key ranges in serializable transactions.

这表明一系列键将被锁定,而不仅仅是一个。

最佳答案

键锁会影响与给定谓词(某种)匹配的所有行 - 在您的示例中,surname = 'Jones' 的所有行都将受到影响。

使用“范围”一词是因为根据谓词,一系列行可能会受到影响,例如,如果谓词是 age > 18,则年龄大于 18 的所有行都会受到影响。

<小时/>

了解键锁并不简单地单独锁定索引中的每个匹配行也很重要 - 您的示例键锁不仅会影响索引中姓氏“Jones”的所有现有行,还会影响任何修改尝试现有行或插入姓氏为“Jones”的新行。

以稍微不同的方式考虑锁可能会有所帮助 - 仅当 SQL Server 尝试获取另一个可能不兼容的锁时,锁才会起作用(即同时拥有两个锁是不合法的)同时)。例如,如果您对 age > 18 的行有独占键锁,并尝试插入或修改 age = 42 的行,那么 SQL Server 将首先尝试获取相关锁 - 看到 age > 18 的行存在一个现有的键锁,SQL Server 确定这些锁不兼容并采取相应的操作。

关于sql-server - key 锁实际上锁定了什么资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012911/

相关文章:

SQL JOIN AND OR 条件

sql-server - 检查用户是否是 SQL Server 中 dbo 角色的成员

sql - T-SQL 事务和表锁定

MongoDB 并发问题

mysql - 并发/同步问题

locking - 如何使用榛铸锁

sql - 在sql server中生成下一个序列号

sql - 存储用于分页的 SQL Server 查询结果

sql - 在 SQL Server 中搜索当前日期的数据

sql - T-SQL - 按周旋转