Transaction

Hash之間的並發控制B-Tree

  • August 11, 2022

我是交易新手。當我閱讀“事務資訊系統”一書時,提到 B-tree 使用鍵範圍鎖定來保證可串列化。這是真的所有對關係的訪問都必須通過相同的 B-tree 進行以保證可序列化嗎?

如果我理解正確,如果訪問是通過不同的索引,則無法保證可序列化。請參見以下範例。

假設同一個關係上有兩個索引,分別是B-Tree和雜湊索引,並且有兩個事務。

首先,一個事務使用散列索引讀取關係,例如,fetchkey(16)使用鍵獲取(目前不存在的)記錄16並且找不到匹配項。由於散列沒有鍵範圍鎖定,它不能鎖定下一個鍵。然後,另一個事務通過 B-tree 插入一條鍵為 ‘16’ 的記錄。插入將成功,導致幻像。

有多種類型和級別的鎖定。更高級別的鎖定是對整個表對象本身的鎖定。這將包括該表上的所有索引。通常,當相對於表中的總數修改某個門檻值的行時,就會發生這種情況,這被稱為鎖升級。

請參閱 DBA.StackExchange 問題,標題為什麼是鎖升級?了解更多資訊。

鎖定和儲存機制是獨立的。

如果您的 DBMS 恰好已經有 BTree,那麼鍵範圍鎖定是一個方便的實現細節。

在沒有 BTree 的情況下,不同的實現可能是謂詞鎖定。在此比較執行查詢的 WHERE 子句。如果新查詢的 where 子句與現有查詢的新查詢隊列衝突。

例如,假設我們有 ID 為 10、20、50、100 的行。查詢 1 的謂詞是..WHERE ID between 15 and 75。範圍鎖定必須覆蓋次低和次高的現有密鑰。所以鎖定在 10..100。現在,如果查詢 2 嘗試寫入..WHERE ID = 88,它將阻塞,因為 88 位於 10..100 的鎖定範圍內。

然而,使用謂詞鎖定,系統將辨識出查詢 2 的謂詞 (88) 位於查詢 1 的範圍之外 (15..75),因此查詢 2 可以繼續。沒有幻像的風險,因此結果是可序列化的。

謂詞可以任意複雜,因此將每個新查詢與每個已經執行的查詢進行匹配並非易事。額外的吞吐量可能無法支付繁忙系統的成本。

對於散列索引,有諸如保序散列之類的東西。對於我們的範例,這意味著 hash(100) 大於 hash(75) 並且仍然可以應用範圍鎖定。

引用自:https://dba.stackexchange.com/questions/315481