加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

关于SQLServer死锁的诊断和定位

发布时间:2020-12-12 15:47:58 所属栏目:MsSql教程 来源:网络整理
导读:关于 SQLServer 死锁的诊断和定位 在 SQLServer 中经常会发生死锁情况,必须连接到企业管理器— 管理— 当前活动— 锁 / 进程 ID 去查找相关死锁进程和定位死锁的原因。 通过查询分析器也要经过多个系统表 (sysprocesses,sysobjects 等 ) 和系统存储过程 (sp
??Create procedure sp_check_deadlock

??as
??set nocount on
? ?
??/*
??select
??spid
被锁进程ID,
??blocked 锁进程ID,
??status
被锁状态,
??SUBSTRING(SUSER_SNAME(sid),1,30) 被锁进程登陆帐号,
??SUBSTRING(hostname,12)
被锁进程用户机器名称,
??SUBSTRING(DB_NAME(dbid),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),
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? ?
EXEC('DBCC INPUTBUFFER('+@lockedspid+')')
??
INSERT INTO #locktracestatus??
select @belockedspid,'被锁进程',a.EventType,a.EventInfo,@lockedspid,'锁进程',b.EventType,b.EventInfo
??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

?

转自:http://www.itpub.net/thread-1007822-1-1.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

关于SQLServer死锁的诊断和定位




SQLServer 中经常会发生死锁情况,必须连接到企业管理器—> 管理—> 当前活动—> / 进程 ID 去查找相关死锁进程和定位死锁的原因。
通过查询分析器也要经过多个系统表(sysprocesses,sysobjects ) 和系统存储过程(sp_who,sp_who2,sp_lock ) ,而且不一定能够直接定位到。

本存储过程参考sp_lock_check sysprocesses 系统表,同时利用了DBCC 命令,直接将死锁和造成死锁的进程和相关语句列出,以方便分析和定位。

    推荐文章
      热点阅读