sql server deadlock跟蹤的四種方法
最近寫程序常會遇到deadlock victim,每次一臉懵逼。研究了下怎麽跟蹤,寫下來記錄下。
建測試數據
CREATE DATABASE testdb; GO USE testdb; CREATE TABLE table1 ( id INT IDENTITY PRIMARY KEY, student_name NVARCHAR(50) ) INSERT INTO table1 values (‘James‘) INSERT INTO table1 values (‘Andy‘) INSERT INTO table1 values (‘Sal‘) INSERT INTO table1 values (‘Helen‘) INSERT INTO table1 values (‘Jo‘) INSERT INTO table1 values (‘Wik‘) CREATE TABLE table2 ( id INT IDENTITY PRIMARY KEY, student_name NVARCHAR(50) ) INSERT INTO table2 values (‘Alan‘) INSERT INTO table2 values (‘Rik‘) INSERT INTO table2 values(‘Jack‘) INSERT INTO table2 values (‘Mark‘) INSERT INTO table2 values (‘Josh‘) INSERT INTO table2 values (‘Fred‘)
第一段sql,先運行只更新table1部分
USE testdb; -- Transaction1 BEGIN TRAN UPDATE table1 SET student_name = student_name + ‘Transaction1‘ WHERE id IN (1,2,3,4,5) UPDATE table2SET student_name = student_name + ‘Transaction1‘ WHERE id = 1 COMMIT TRANSACTION
第二段sql,只運行更新table2部分
USE testdb; -- Transaction2 BEGIN TRAN UPDATE table2 SET student_name = student_name + ‘Transaction2‘ WHERE id = 1 UPDATE table1 SET student_name = student_name + ‘Transaction2‘ WHERE id IN (1,2,3,4,5) COMMIT TRANSACTION
再運行,第一段sql更新table2,運行第二段sql更新table1,死鎖問題重現。
說下跟蹤死鎖的方法:
1.使用trace log跟蹤,執行如下sql開啟1222和1204 flag,死鎖信息會在sql server 日誌中輸出。
DBCC TRACEON (1204, -1) DBCC TRACEON (1222, -1)
下圖是1204輸出的信息
下圖是1222輸出的信息
2.使用sql server profiler進行跟蹤
點擊Tools -> sql server profiler 選擇sql locks模板
運行當發生死鎖時會自動捕獲,點擊dead lock paragraph查看死鎖
3.使用擴展事件跟蹤,方法只適用於sql server 2012版本,08r2版本無法直接使用。
依次點擊Management -> Extended Events - >system health - >package0.event_file
輸入deadlock回車,可以點擊details 把內容另存為xdl文件再打開,或點擊deadlock查看圖
4.使用windows性能計數器檢測到死鎖再去sql中查詢
命令行輸入:perfmon 或者 perfmon /sys
選擇實例:SQL Server :Locks \\ Number of DeadLocks/sec \\ _Total
實時查看:
下面的查詢提供了自從上次重啟以來在本服務器上發生的所有死鎖:
SELECT cntr_value AS NumOfDeadLocks
FROM sys.dm_os_performance_counters
WHERE object_name = ‘SQLServer:Locks‘
AND counter_name = ‘Number of Deadlocks/sec‘
AND instance_name = ‘_Total‘
sql server deadlock跟蹤的四種方法