我知道钥匙锁将钥匙锁定在索引中。然而,“钥匙”到底意味着什么呢?
例如,如果我在姓氏列上有一个非聚集索引并尝试更新姓氏 =“Jones”的位置,那么我是否会有效锁定表中姓氏为“Jones”的每一行?或者索引会被锁定在更高的级别,从而阻止访问姓氏不是“Jones”的行吗?
我问这个问题的原因是在线书籍中有关锁定粒度和层次结构的注释:
KEY:索引中的行锁,用于保护可序列化事务中的键范围。
这表明一系列密钥将被锁定,而不仅仅是一个。
键锁会影响与给定谓词(某种)匹配的所有行 - 在您的示例中,所有行surname = 'Jones'
会受到影响。
使用“范围”一词是因为根据谓词,行的范围可能会受到影响,例如,如果谓词是age > 18
那么年龄大于 18 的所有行都会受到影响。
同样重要的是要了解键锁并不简单地单独锁定索引中的每个匹配行 - 您的示例键锁不仅会影响索引中姓氏为“Jones”的所有现有行,还会影响任何修改现有行的尝试或插入姓氏为“Jones”的新行。
以稍微不同的方式考虑锁可能会有所帮助 - 锁仅在 SQL Server 尝试获取另一个锁时才有效,而该锁可能是不相容(即同时拥有两个锁是不合法的)。例如,如果您对具有以下内容的行有独占键锁age > 18
并尝试插入或修改行age = 42
那么SQL Server将首先尝试获取相关的锁 - 看到有一个现有的键锁用于行age > 18
SQL Server 确定锁不兼容并采取相应的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)