百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> sql server deadlock跟踪的4种实现要领
分享文章到:

sql server deadlock跟踪的4种实现要领

发布时间:05/13 来源:未知 浏览: 关键词:

前言

最近写程序常会碰到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,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'

总结

以上就是这篇文章的全部内容了,但愿本文的内容对大家的学习或者工作拥有一定的参考学习价值,要是有疑难大家可以留言交换,感谢大家对我们的支撑。

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有155人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板