Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 钥匙锁实际上锁定的是什么资源?_Sql Server_Tsql_Locking - Fatal编程技术网

Sql server 钥匙锁实际上锁定的是什么资源?

Sql server 钥匙锁实际上锁定的是什么资源?,sql-server,tsql,locking,Sql Server,Tsql,Locking,我知道钥匙锁把钥匙锁在索引里。然而,“关键”到底是什么意思 例如,如果我在姓氏列上有一个非聚集索引,并尝试更新其中的姓氏=“Jones”,我是否会有效地锁定表中姓氏为“Jones”的每一行?或者索引会被锁定在更高的级别,阻止访问姓氏不是“Jones”的行 我问这个问题的原因是在线书籍中关于锁粒度和层次结构的注释: 键:索引中的行锁,用于在可序列化事务中保护键范围 这表明将锁定一系列键,而不仅仅是一个键。一个键锁定会影响与给定谓词(种类)匹配的所有行-在您的示例中,所有带有姓氏='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?