2011-05-16 65 views
17

我知道一個鍵鎖在一個索引中鎖定了一個鍵。但是,「關鍵」究竟意味着什麼?鑰匙鎖實際上鎖定了哪些資源?

例如,如果我在姓氏列上有一個非聚集索引並嘗試進行surname =「Jones」的更新,那麼我是否有效鎖定了姓氏爲「Jones」的表中的每一行?或者將索引鎖定在更高的級別,阻止訪問「瓊斯」以外的姓氏的行?

的原因,我問的是本說明聯機叢書中的有關鎖的粒度和層次結構:

鍵:用於重點保護範圍串行事務中的索引中的行鎖。

這表明一個鍵的範圍將被鎖定,而不僅僅是一個。

+0

「可序列化的事務」意味着事務隔離級別設置爲「可序列化」嗎?因爲當我調試一個死鎖時,我看到了「讀取已提交」隔離級別中的鍵鎖。 – kolobok 2018-02-21 15:25:51

回答

28

鍵盤鎖會影響與給定謂詞(種類)匹配的所有行 - 在您的示例中,所有具有surname = 'Jones'的行都將受到影響。

使用「範圍」這個詞是因爲根據謂詞的不同,可能會影響行的範圍,例如,如果謂詞是age > 18,那麼年齡大於18的所有行都會受到影響。


同樣重要的是要明白,一鍵鎖定不只是單獨的索引鎖定每個匹配的行 - 你的榜樣鑰匙鎖不僅影響與姓「奇兵」的索引的所有現有行,它也影響任何嘗試修改現有行或插入姓氏爲「Jones」的新行。

它可以幫助想在一個稍微不同的方式鎖定 - 當SQL Server試圖獲得另一把鎖可以是鎖纔有效不相容(即它是不合法的,在同一時間兩個鎖)。例如,如果對age > 18的行擁有獨佔密鑰鎖並嘗試插入或修改一行,則SQL服務器將首先嚐試獲取相關鎖 - 查看存在對具有age > 18 SQL的行的現有密鑰鎖服務器確定這些鎖不兼容並採取相應的措施。

+0

非常感謝Kragen,你的回覆說得很清楚。 – 2011-05-16 04:26:19