我知道键锁将索引中的键锁定。但是,“键”实际上是什么意思?
例如,如果我在姓氏列上具有非聚集索引,并尝试在surname =“Jones”的地方进行更新,我是否将有效地锁定姓氏为“Jones”的表中的每一行?还是将索引锁定在较高级别,以防止访问姓氏不是“Jones”的行?
我问的原因是《联机丛书》中有关锁定粒度和层次结构的注释:
这表明将锁定一系列键,而不仅仅是一个。
最佳答案
键锁会影响与给定谓词(种类)匹配的所有行-在您的示例中,所有带有surname = 'Jones'
的行都会受到影响。
使用单词“范围”是因为取决于谓词,可能会影响行的范围,例如,如果谓词是age > 18
,则年龄大于18的所有行都会受到影响。
同样重要的是要理解,键锁不能简单地单独锁定索引中的每个匹配行-您的示例键锁不仅会影响姓氏为“Jones”的索引中的所有现有行,而且还会影响任何修改现有行的尝试或插入姓氏为“Jones”的新行。
以稍微不同的方式考虑锁可能会有所帮助-锁仅在SQL Server尝试获取另一个可能是不兼容的锁时才起作用(即,同时拥有两个锁是不合法的)。例如,如果您在带有age > 18
的行上具有排他键锁,并尝试插入或修改带有age = 42
的行,则SQL Server将首先尝试获取相关的锁-看到存在一个带有age > 18
的行的现有键锁SQL Server确定锁不兼容,并采取相应的措施。
关于sql-server - 按键锁实际锁定什么资源?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6012911/