在 SQL Server, 死結的發生是因為有兩個或多個工作(processes) 正在互相等待彼此所保留鎖著的資源,而造成工作永久封鎖彼此的情況。當 deadlock 發生時, SQL Server 會自行選擇其中一個工作作為犧牲者,以錯誤來結束其交易。如下。
一般來講, DBA 會開啟設定 trace flag (1222) 來蒐集 deadlock 的資訊,以便分析 deadlock 的發生。另外一個方法就是使用擴充事件 (Extended Events) 的 system_health 工作階段 (Sessions) 來查詢 deadlock 的發生原因。如下。
select event_data = CONVERT(XML, event_data)
from sys.fn_xe_file_target_read_file(N'system_health*.xel', NULL, NULL, NULL)
where event_data like '%xml_deadlock%'
點選 xml,就可以查詢到死結發生的原因。