Sql-Server

插銷和鎖的區別

  • November 9, 2019

最近,當我試圖查找有關latch_ex 等待類型的資訊時,我偶然發現了一篇關於latch 和lock 的部落格,如下所示。

在此處輸入圖像描述

讀完這篇部落格後,我只是對一件事感到好奇。當應用程序送出請求時,SQL Server 會首先在緩衝區記憶體中查找資訊,如果該頁面不在緩衝區記憶體中,則只會從磁碟讀取並將其放入緩衝區記憶體中,然後再將資訊發送給應用程序。我的問題基於上面的螢幕截圖,其中指出閂鎖和鎖定需要避免兩個執行緒更新同一頁面。基本上所有到 SQL Server 的請求都會先到緩衝區記憶體,如果緩衝區記憶體中的頁面忙於更新,另一個執行緒將不得不等待。它不會回到磁碟,因為頁面已經在記憶體中。那麼鎖的目的是什麼,因為每個請求都將通過記憶體完成,並且有鎖存器來保護頁面

我真的不明白你在引用中不理解的內容(奇怪的是,作為截圖),因為它非常清楚地解釋了差異,在我看來。

鎖和閂具有不同的範圍和生命週期。鎖適用於您可能稱之為數據庫物理模型元素的東西——表、行、索引條目。鎖存器保護數據庫伺服器在執行 SQL 語句或執行其管理任務時使用的各種記憶體結構。

一個事務可能在它正在處理的對像上持有一個、多個或根本沒有鎖,這向其他事務發出信號,它們可以對這些對象進行何種訪問。受鎖保護的對像不必“在記憶體中”;例如,受表級鎖保護的表甚至可能沒有任何頁面存在於緩衝池中。

工作執行緒獲取和釋放閂鎖以嚴格防止其他並發執行的執行緒(可能正在同一事務、其他事務或代表某些伺服器後台程序中執行任務)同時訪問某些記憶體區域。例如,兩個事務可能會為同一緩衝池頁面上的不同行持有鎖,這不會阻止它們同時訪問各自的行,如果不是頁面鎖存器確保整個頁面對所有讀取器和寫入器保持一致. 然後是一個惰性寫入器程序,它不太關心這些鎖中的任何一個,但仍然必須獲取一個鎖存器,然後才能將一致的頁面寫入磁碟。

換句話說,鎖是一種事務同步機制,而鎖有助於同步程序或執行緒

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