1. 程式人生 > 資料庫 >sql server deadlock跟蹤的4種實現方法

sql server deadlock跟蹤的4種實現方法

前言

最近寫程式常會遇到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 table2
SET 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,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'

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對我們的支援。