Sql-Server

您應該執行哪些查詢來調試導致死鎖的儲存過程以及我應該在 MSSQL 上查看哪一行?

  • May 4, 2022

您應該執行哪些查詢來調試導致死鎖的儲存過程以及我應該在 MSSQL 上查看哪一行?我正在嘗試修復 MSSQL 上反復出現的死鎖。問題是我不確定應該執行哪些查詢來獲取所需的所有資訊。

您可以將程式碼添加到儲存過程,以便在每個步驟開始和完成時將進度輸出到消息視窗。

DECLARE @strStatus VARCHAR(200);
SET @strStatus = CONVERT(VARCHAR(30), GETDATE()) + ' Starting sp1...';
RAISERROR (@strStatus, 10, 1) WITH NOWAIT;

EXEC sp1

SET @strStatus = CONVERT(VARCHAR(30), GETDATE()) + ' Finished sp1...';
RAISERROR (@strStatus, 10, 1) WITH NOWAIT;

有多種方法可以擷取死鎖細節,

  1. 以下跟踪標誌會將完整的死鎖詳細資訊寫入 SQL Server 錯誤日誌,
DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1)
  1. 設置擴展事件會話以擷取詳細資訊,
CREATE EVENT SESSION [Deadlock_Capture] ON SERVER 
ADD EVENT sqlos.scheduler_monitor_deadlock_ring_buffer_recorded,
ADD EVENT sqlserver.lock_deadlock,
ADD EVENT sqlserver.lock_deadlock_chain,
ADD EVENT sqlserver.xml_deadlock_report
ADD TARGET package0.ring_buffer(SET max_events_limit=(10),max_memory=(131072))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
GO
  1. 我最不喜歡的選項是使用 SQL Profiler,擷取這些事件類Lock: Deadlock ChainDeadlock graph.

使用方法 1 和 2 你會看到像這裡這樣的死鎖資訊,

SQL 錯誤日誌中的方法 01。

來自擴展事件環形緩衝區的方法 02。

您可以在我用來模擬死鎖的任何一個文件中找到查詢。

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