Sql-Server

在 SQL Server / Azure SQL 中,有沒有辦法查看查詢產生或想要產生的鎖?

  • May 3, 2022

我正在嘗試調查鎖定情況。我知道如何通過查詢來查看數據庫上的目前鎖,sys.dm_tran_locks但我想要的是採用特定的 SQL 查詢並對其進行某種“分析”來計算它將生成什麼鎖。就像鎖的執行計劃?

它也可以是我執行查詢然後查看生成了哪些鎖的一種方式,對我來說是一樣的。我只需要一種方法來記錄/查看生成的日誌,因為我目前只能看到正在持有的“實時”鎖。

我特別需要盡可能多地了解這些鎖的詳細資訊:類型、模式、它持有的對像等。

我在 Azure SQL 數據庫上。

簡單的方法是啟動事務,執行查詢,然後檢查 sys.dm_tran_locks。但這只會顯示查詢後持有的鎖,通常是 U 或 X 鎖,或 REPEATABLE READ 或 SERIALIZABLE 中的 S 鎖。例如

if @@trancount > 0 rollback

begin transaction

--run some queries 

select *
from sys.dm_tran_locks
where request_session_id = @@spid 

rollback

要查看語句的鎖獲取和釋放的完整歷史記錄,請使用 XEvents 或 Profiler 來擷取會話的 lock:acquired 和 lock:released 事件。請注意,此跟踪非常冗長,因此不要嘗試在整個實例或生產伺服器上擷取它。

多一點

大衛的回答是正確的,但要添加一些可能很重要的東西……

您通常可以從執行計劃中推斷並查詢:

  • 搜尋將從鑰匙鎖開始
  • 掃描將從頁面鎖定開始
  • 本地鎖定提示通常會覆蓋其他設置(儘管可能並不總是遵守行鎖)
  • 具有級聯操作的外鍵將採用可序列化鎖
  • 當視圖定義跨越多個表時,索引視圖維護將採用可序列化鎖

有些事情只能在執行時確定,有些只能在並發下確定。例如,可能會嘗試鎖升級,但由於對像上的競爭鎖不兼容,可能並不總是成功。也可能有一些局部因素會改變鎖定行為,例如圍繞允許行和頁鎖定更改索引選項等。

要監控鎖,您可以使用:

您可以使用擴展事件會話來監視鎖定,例如我以前的答案:Offline Index Rebuild on a Partitioned Table

但公平的警告,您需要更改它以與 Azure SQLDB 兼容。您需要更改對 to 的引用SERVERDATABASE並且您需要在將文件儲存在 Blob 儲存中或僅使用 Ring Buffer 之間進行選擇。如果您選擇通過 GUI 使用會話數據,則在嘗試查詢會話數據時,您還需要點擊稍微不同的視圖。

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