sql server deadlock跟蹤的4種實(shí)現(xiàn)方法
前言
最近寫(xiě)程序常會(huì)遇到deadlock victim,每次一臉懵逼。研究了下怎么跟蹤,寫(xiě)下來(lái)記錄下。文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
建測(cè)試數(shù)據(jù)
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,先運(yùn)行只更新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,只運(yùn)行更新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
再運(yùn)行,第一段sql更新table2,運(yùn)行第二段sql更新table1,死鎖問(wèn)題重現(xiàn)。
說(shuō)下跟蹤死鎖的方法:
1.使用trace log跟蹤,執(zhí)行如下sql開(kāi)啟1222和1204 flag,死鎖信息會(huì)在sql server 日志中輸出。
DBCC TRACEON (1204, -1) DBCC TRACEON (1222, -1)
下圖是1204輸出的信息
下圖是1222輸出的信息
2.使用sql server profiler進(jìn)行跟蹤
點(diǎn)擊Tools -> sql server profiler 選擇sql locks模板
運(yùn)行當(dāng)發(fā)生死鎖時(shí)會(huì)自動(dòng)捕獲,點(diǎn)擊dead lock paragraph查看死鎖
3.使用擴(kuò)展事件跟蹤,方法只適用于sql server 2012版本,08r2版本無(wú)法直接使用。
依次點(diǎn)擊Management -> Extended Events - >system health - >package0.event_file
輸入deadlock回車,可以點(diǎn)擊details 把內(nèi)容另存為xdl文件再打開(kāi),或點(diǎn)擊deadlock查看圖
4.使用windows性能計(jì)數(shù)器檢測(cè)到死鎖再去sql中查詢
命令行輸入:perfmon 或者 perfmon /sys
選擇實(shí)例:SQL Server :Locks \\ Number of DeadLocks/sec \\ _Total
實(shí)時(shí)查看:
下面的查詢提供了自從上次重啟以來(lái)在本服務(wù)器上發(fā)生的所有死鎖:
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'
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SQL SERVER中關(guān)于exists 和 in的簡(jiǎn)單分析
這篇文章主要介紹了SQL SERVER中關(guān)于exists 和 in的簡(jiǎn)單分析,需要的朋友可以參考下2014-08-08SqlServer Mysql數(shù)據(jù)庫(kù)修改自增列的值及相應(yīng)問(wèn)題的解決方案
這篇文章主要介紹了SqlServer Mysql數(shù)據(jù)庫(kù)修改自增列的值及相應(yīng)問(wèn)題的解決方案的相關(guān)資料,需要的朋友可以參考下2016-01-01遠(yuǎn)程連接SQLSERVER 2000服務(wù)器方法
需求如下:需要遠(yuǎn)程連接外地的SQL Server 2000服務(wù)器。2009-07-07SQL語(yǔ)句實(shí)現(xiàn)刪除ACCESS重復(fù)記錄的兩種方法
有兩個(gè)意義上的重復(fù)記錄,一是完全重復(fù)的記錄,也即所有字段均重復(fù)的記錄,二是部分關(guān)鍵字段重復(fù)的記錄,比如Name字段重復(fù),而其他字段不一定重復(fù)或都重復(fù)可以忽略。2010-04-04必須會(huì)的SQL語(yǔ)句(六) 數(shù)據(jù)查詢
這篇文章主要介紹了sqlserver中數(shù)據(jù)查詢方法,需要的朋友可以參考下2015-01-01按日期選擇最晚日期與最早日期對(duì)應(yīng)的數(shù)的差值
想得到當(dāng)天的最早時(shí)間與最晚時(shí)間的number的差值,需要的朋友可以參考下。2009-11-11一條語(yǔ)句簡(jiǎn)單解決“每個(gè)Y的最新X”的經(jīng)典sql語(yǔ)句
“每個(gè)Y的最新X”是一個(gè)經(jīng)典的SQL問(wèn)題,工作中經(jīng)常碰到。當(dāng)然不是“按Y分組求最新的X值”那么簡(jiǎn)單,要求最新X的那條記錄或主鍵ID。用一條SQL語(yǔ)句可以簡(jiǎn)單的解決此問(wèn)題。 生成實(shí)例表和數(shù)據(jù):2008-03-03SQLServer用存儲(chǔ)過(guò)程實(shí)現(xiàn)插入更新數(shù)據(jù)示例
這篇文章主要介紹了SQLServer如何用存儲(chǔ)過(guò)程實(shí)現(xiàn)插入更新數(shù)據(jù),需要的朋友可以參考下2014-08-08