Sim*_*wsi 21 t-sql sql-server locking
我知道密钥锁将索引锁定在索引中.但是,"关键"究竟意味着什么?
例如,如果我在姓氏列上有非聚集索引并尝试更新surname ="Jones",那么我是否有效地锁定了姓氏为"琼斯"的表中的每一行?或者将索引锁定在更高级别,以防止访问除"琼斯"之外的姓氏的行?
我问的原因是联机丛书中关于锁粒度和层次结构的这个注释:
KEY:索引中的行锁,用于保护可序列化事务中的键范围.
这表明一系列钥匙将被锁定,而不仅仅是一个.
Jus*_*tin 33
键锁影响与给定谓词匹配的所有行(种类) - 在您的示例中,所有行都surname = 'Jones'
将受到影响.
使用"范围"一词是因为根据谓词可能会影响一系列行,例如,如果谓词是age > 18
那么年龄大于18的所有行都会受到影响.
同样重要的是要理解密钥锁不是简单地单独锁定索引中的每个匹配行 - 您的示例键锁不仅会影响索引中姓氏为"Jones"的所有现有行,还会影响任何修改现有行的尝试或插入姓氏为"Jones"的新行.
以稍微不同的方式考虑锁可能会有所帮助 - 当SQL Server尝试获取可能不兼容的另一个锁时,锁只会产生影响(即,同时拥有两个锁是不合法的).例如,如果您对行具有独占键锁age > 18
并尝试插入或修改行,age = 42
那么SQL服务器将首先尝试获取relvant锁 - 看到存在age > 18
SQL Server确定的行的现有键锁锁是不兼容的并采取相应的行动.
归档时间: |
|
查看次数: |
17258 次 |
最近记录: |