在 SQL Server / Azure SQL 中,有沒有辦法查看查詢產生或想要產生的鎖?
我正在嘗試調查鎖定情況。我知道如何通過查詢來查看數據庫上的目前鎖,
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 事件。請注意,此跟踪非常冗長,因此不要嘗試在整個實例或生產伺服器上擷取它。
多一點
大衛的回答是正確的,但要添加一些可能很重要的東西……
您通常可以從執行計劃中推斷並查詢:
- 搜尋將從鑰匙鎖開始
- 掃描將從頁面鎖定開始
- 本地鎖定提示通常會覆蓋其他設置(儘管可能並不總是遵守行鎖)
- 具有級聯操作的外鍵將採用可序列化鎖
- 當視圖定義跨越多個表時,索引視圖維護將採用可序列化鎖
有些事情只能在執行時確定,有些只能在並發下確定。例如,可能會嘗試鎖升級,但由於對像上的競爭鎖不兼容,可能並不總是成功。也可能有一些局部因素會改變鎖定行為,例如圍繞允許行和頁鎖定更改索引選項等。
要監控鎖,您可以使用:
- sp_WhoIsActive @get_locks = 1;
- 從 dbo 中選擇 *。WhatsUpLocks (@@SPID) AS wul;
您可以使用擴展事件會話來監視鎖定,例如我以前的答案:Offline Index Rebuild on a Partitioned Table。
但公平的警告,您需要更改它以與 Azure SQLDB 兼容。您需要更改對 to 的引用
SERVER
,DATABASE
並且您需要在將文件儲存在 Blob 儲存中或僅使用 Ring Buffer 之間進行選擇。如果您選擇通過 GUI 使用會話數據,則在嘗試查詢會話數據時,您還需要點擊稍微不同的視圖。