2012-08-29 143 views
12

好,話題引入隔離在維基百科上有這樣的話,鏈接是here什麼是範圍鎖?

......... 序列化 這是最高的隔離級別。 使用基於鎖的併發控制DBMS實現時,可序列化需要在事務結束時釋放讀取和寫入鎖(在選定數據上獲取)。另外範圍鎖必須在SELECT查詢使用範圍內的WHERE子句時獲取,特別是爲了避免幻像讀取現象(見下文)。 使用基於非鎖定的併發控制時,不會獲取鎖定;但是,如果系統在幾個併發事務中檢測到寫衝突,則只允許其中一個事務提交。有關此主題的更多詳細信息,請參閱快照隔離

但整個話題沒有解釋「範圍鎖」,谷歌沒有準確的描述。

什麼是「範圍鎖定」,以及與「讀取鎖定」和「寫入鎖定」不同的是什麼?

謝謝!

回答

8

如果使用WHERE子句中的範圍,數據庫將鎖定此範圍內的每個可能元組以及下一個元組(之前和之後)。如果在一個方向上沒有下一個元組,它將完全鎖定在這個方向上。

因此,SELECT在交易中是可靠的。

+2

這不只是'BETWEEN'。任何時候選擇不是針對單個唯一的行,您可能會得到範圍鎖定。 'SELECT * FROM Users WHERE LastName ='Adams''是一個範圍,因爲它可以返回多行,並且沒有BETWEEN子句。 –

+1

值得注意的是,範圍鎖定還鎖定了兩個元組之間的範圍,而不僅僅是元組本身。 – usr

+0

在這種情況下什麼是「元組」? – d512

9

使用鎖定(並非所有數據庫都使用鎖定)來防止併發操作衝突的最簡單方法是鎖定整個數據庫。儘管如此,這將使所有的事情都變成一個接一個,這會非常緩慢。

接下來是,如果你鎖定一個整個表。至少其他表格不會放慢速度。

最窄的是鎖定一排。您可以安全地更新該行並且不會阻止其他操作。

範圍鎖定在最後兩個之間。它使用的情況包括:

  1. 一系列值受查詢影響。
  2. 非唯一索引受查詢影響(因爲可能有多個行匹配例如23,所以23識別範圍而不是行)。
  3. 插入一個新的自動遞增鍵(鎖定範圍max(curvalue) + indexincrement)。