密钥锁实际上锁定了什么资源?

时间:2011-05-16 03:25:41

标签: sql-server tsql locking

我知道密钥锁会锁定索引中的密钥。但是,“关键”究竟意味着什么?

例如,如果我在姓氏列上有非聚集索引并尝试更新surname =“Jones”,那么我是否有效地锁定了姓氏为“琼斯”的表中的每一行?或者将索引锁定在更高级别,以防止访问姓氏不是“Jones”的行?

我问的原因是联机丛书中有关锁粒度和层次结构的注释:

  

KEY:索引中的行锁,用于保护可序列化事务中的键范围。

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

1 个答案:

答案 0 :(得分:33)

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

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


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

以稍微不同的方式考虑锁可能会有所帮助 - 当SQL Server尝试获取可能不兼容的另一个锁时,锁只会产生影响(即,同时拥有两个锁是不合法的同时)。例如,如果对具有age > 18的行具有独占键锁并尝试插入或修改具有age = 42的行,则SQL Server将首先尝试获取relvant锁 - 看到存在age > 18 SQL Server的行的现有密钥锁定确定锁不兼容并采取相应的操作。