当前位置: 首页 > news >正文

关于SQLServer死锁的诊断和定位

关于 SQLServer 死锁的诊断和定位
在 SQLServer 中经常会发生死锁情况,必须连接到企业管理 器— > 管理— > 当前活动— > 锁 / 进程 ID 去查找相关死锁进程和定位死锁的原因。
通过查询分析器也要经过多个系统表 (sysprocesses,sysobjects 等 ) 和系统存储过程 (sp_who,sp_who2,sp_lock 等 ) ,而且不一定能够直接定位到。
本存储过程参考 sp_lock_check 和 sysprocesses 系统表,同时利用了 DBCC 命令,直接将死锁和造成死锁的进程和相关语句列出,以方便分析和定位。
Create procedure sp_check_deadlock            
as
set nocount on
 /*
select
spid    被锁进程 ID,
 blocked 锁进程 ID,
 status  被锁状态 ,
SUBSTRING(SUSER_SNAME(sid),1,30) 被锁进程登陆帐号 ,
 SUBSTRING(hostname,1,12)         被锁进程用户机器名称 ,
SUBSTRING(DB_NAME(dbid),1,10)    被锁进程数据名称 ,
cmd 被锁进程命令 ,
 waittype 被锁进程等待类型
FROM master..sysprocesses

WHERE blocked>0
--dbcc inputbuffer(66) 输出相关锁进程的语句
-- 创建锁进程临时表
CREATE TABLE #templocktracestatus ( 
  EventType varchar(100),
  Parameters INT,
  EventInfo varchar(200)
)
(
-- 创建被锁进程临时表
CREATE TABLE #tempbelocktracestatus (
  EventType varchar(100),
  Parameters INT,  EventInfo varchar(200)
)
-- 创建之间的关联表
CREATE TABLE #locktracestatus (
  belockspid INT,
  belockspidremark varchar(20),
  belockEventType varchar(100),
  belockEventInfo varchar(200),
lockspid INT
  lockspidremark  varchar(20)
  lockEventType   varchar(100)
  lockEventInfo   varchar(200)
  )

-- 获取死锁进程
DECLARE dbcc_inputbuffer CURSOR READ_ONLY
FOR select spid 被锁进程 ID,blocked 锁进程 ID
     FROM master..sysprocesses
    WHERE blocked>0
DECLARE @lockedspid int          DECLARE @belockedspid int
OPEN dbcc_inputbuffer

FETCH NEXT FROM dbcc_inputbuffer INTO @belockedspid,@lockedspid
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
        --print ' 被堵塞进程 
        --select @belockedspid
--dbcc inputbuffer(@belockedspid
        --print ' 堵塞进程         --select @lockedspid
  --dbcc inputbuffer(@lockedspid)
        INSERT INTO #tempbelocktracestatus
      EXEC('DBCC INPUTBUFFER( '+@belockedspid+')')
        INSERT INTO #templocktracestatus
5b4Eq*y0GpC6517           EXEC('DBCC INPUTBUFFER( '+@lockedspid+')') 
        INSERT INTO #locktracestatus
 select @belockedspid,' 被锁进程 ',a.EventType,a.EventInfo,@lockedspid,' 锁进程 
             from #tempbelocktracestatus a,#templocktracestatus b
       END
       FETCH NEXT FROM dbcc_inputbuffer INTO @belockedspid,@lockedspid
END
CLOSE dbcc_inputbuffer
DEALLOCATE dbcc_inputbuffer
select * from #locktracestatus
return (0) -- sp_check_deadlock


 
执行该存储过程
exec sp_check_deadlock
 
 

相关文章:

  • NAGVIS安装详解
  • 和外国骗子第一次亲密接触
  • ntp 同步
  • Flex 全屏显示方法
  • 2009第二届C++技术大会即将在上海隆重召开
  • IE并发连接限制(as)
  • 没有路由实现网络的互通
  • 动态创建DeepZoom
  • 用心去欣赏美
  • Linux下C开发之gcc,gdb的使用
  • 数据库技术人员的能力评估建议与培养规划
  • 如何压缩javascript和css文件?
  • C++成员初始化列表
  • 在父子关系表中获取子孙后代结点数据SQL查询算法
  • C#网络编程之Socket一
  • 《Java编程思想》读书笔记-对象导论
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • javascript数组去重/查找/插入/删除
  • MD5加密原理解析及OC版原理实现
  • node学习系列之简单文件上传
  • Sass 快速入门教程
  • spark本地环境的搭建到运行第一个spark程序
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 面试总结JavaScript篇
  • 爬虫模拟登陆 SegmentFault
  • 三分钟教你同步 Visual Studio Code 设置
  • 设计模式走一遍---观察者模式
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 计算机视觉入门
  • (1)SpringCloud 整合Python
  • (12)Hive调优——count distinct去重优化
  • (14)Hive调优——合并小文件
  • (9)STL算法之逆转旋转
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (论文阅读40-45)图像描述1
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)创业家杂志:UCWEB天使第一步
  • (转)平衡树
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Mobi域名介绍
  • .NET Core 项目指定SDK版本
  • .NetCore 如何动态路由
  • .NET正则基础之——正则委托
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ C++ ] STL---仿函数与priority_queue
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [android学习笔记]学习jni编程
  • [BIZ] - 1.金融交易系统特点
  • [c++] 自写 MyString 类
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!