sql-server – 金鑰鎖實際鎖定什麼資源?
我知道鑰匙鎖在索引中鎖定一個鍵.但是,“關鍵”究竟是什麼意思呢?
例如,如果我在一個姓氏列上有一個非聚集索引,並嘗試更新surname =“Jones”,那麼我會有效地鎖定姓氏是“Jones”的表中的每一行嗎?或者將索引鎖定在更高級別,阻止訪問除“瓊斯”以外的姓氏的行?
我問的原因是線上書籍關於鎖定粒度和層次結構的這個註釋:
KEY: A row lock within an index used to protect key ranges in serializable transactions.
這表明一系列的鑰匙將被鎖定,而不僅僅是一個.
鍵鎖影響與給定謂詞(種類)匹配的所有行 – 在示例中,所有具有surname =’Jones’的行都將受到影響.
使用單詞“range”,因為根據謂詞可能會影響行範圍,例如,如果謂詞為age> 18那麼年齡大於18的所有行都會受到影響.
同樣重要的是要明白,鍵鎖並不是簡單地單獨鎖定索引中的每個匹配行 – 您的示例鍵鎖不僅會影響索引中所有現有行的姓氏“Jones”,還會影響任何修改現有行的嘗試或者插入一個名為“瓊斯”的新行.
它可能有助於以稍微不同的方式思考鎖 – 只有當SQL Server嘗試獲得可能不相容的另一個鎖(即同時具有兩個鎖是不合法的)時,鎖才有效果.例如,如果您在具有年齡>的行上擁有專屬金鑰鎖定18,並嘗試插入或修改age = 42的行,然後SQL Server將首先嚐試獲取相關鎖 – 看到存在具有年齡>的行的現有金鑰鎖. 18 SQL Server確定鎖是不相容的,並採取相應的行動.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/6012911/what-resource-does-a-key-lock-actually-lock