Sql server 钥匙锁实际上锁定的是什么资源?
我知道钥匙锁把钥匙锁在索引里。然而,“关键”到底是什么意思 例如,如果我在姓氏列上有一个非聚集索引,并尝试更新其中的姓氏=“Jones”,我是否会有效地锁定表中姓氏为“Jones”的每一行?或者索引会被锁定在更高的级别,阻止访问姓氏不是“Jones”的行 我问这个问题的原因是在线书籍中关于锁粒度和层次结构的注释: 键:索引中的行锁,用于在可序列化事务中保护键范围Sql server 钥匙锁实际上锁定的是什么资源?,sql-server,tsql,locking,Sql Server,Tsql,Locking,我知道钥匙锁把钥匙锁在索引里。然而,“关键”到底是什么意思 例如,如果我在姓氏列上有一个非聚集索引,并尝试更新其中的姓氏=“Jones”,我是否会有效地锁定表中姓氏为“Jones”的每一行?或者索引会被锁定在更高的级别,阻止访问姓氏不是“Jones”的行 我问这个问题的原因是在线书籍中关于锁粒度和层次结构的注释: 键:索引中的行锁,用于在可序列化事务中保护键范围 这表明将锁定一系列键,而不仅仅是一个键。一个键锁定会影响与给定谓词(种类)匹配的所有行-在您的示例中,所有带有姓氏='Jones'的行
这表明将锁定一系列键,而不仅仅是一个键。一个键锁定会影响与给定谓词(种类)匹配的所有行-在您的示例中,所有带有
姓氏='Jones'
的行都会受到影响
之所以使用“范围”一词,是因为根据谓词的不同,行的范围可能会受到影响,例如,如果谓词为age>18
,则年龄大于18的所有行都会受到影响
同样重要的是要理解,键锁并不是简单地单独锁定索引中的每个匹配行-您的示例键锁不仅影响索引中所有姓氏为“Jones”的现有行,还影响修改现有行或插入姓氏为“Jones”的新行的任何尝试
以稍微不同的方式考虑锁可能会有所帮助—只有当SQL Server尝试获取另一个可能不兼容的锁时,锁才会起作用(即,同时拥有两个锁是不合法的)。例如,如果您对
age>18
的行具有独占密钥锁,并尝试插入或修改age=42
的行,则SQL server将首先尝试获取相关的锁-看到age>18
的行存在现有密钥锁,SQL server确定这些锁不兼容,并且相应地采取行动。可序列化事务是否意味着事务隔离级别设置为“可序列化”?因为当我调试一个死锁时,我在“readcommitted”隔离级别中看到了密钥锁。这很有用。不过我很好奇,为什么你在第一句话中加上“有点”呢?语句“keylock影响与给定谓词匹配的所有行”是否不总是true?