查看: 4980|回复: 2

[原创] 关于SQLServer死锁的诊断和定位

[复制链接]
论坛徽章:
181
慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:31
跳转到指定楼层
1#
发表于 2008-6-18 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于SQLServer死锁的诊断和定位



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

本存储过程参考sp_lock_checksysprocesses系统表,同时利用了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   
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
  


[ 本帖最后由 bq_wang 于 2008-6-18 11:18 编辑 ]
论坛徽章:
181
慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:31
2#
 楼主| 发表于 2008-6-18 14:15 | 只看该作者
被锁进程
    ID
进程类别事件类型被锁语句锁进程
    ID
进程类别事件类型锁语句
66被锁进程Language  EventSET  LOCK_TIMEOUT -1
SET DEADLOCK_PRIORITY  LOW
SET TRANSACTION ISOLATION  LEVEL
REPEATABLE READ
BEGIN TRAN
SELECT * FROM tb WHERE id=1
UPDATE ta SET id=2 WHERE id=1
COMMIT TRAN
65锁进程Language  EventSET  LOCK_TIMEOUT -1
SET TRANSACTION  ISOLATION LEVEL
REPEATABLE  READ
BEGIN TRAN
SELECT * FROM ta WHERE id=1
WAITFOR DELAY '00:05:00'
UPDATE tb SET id=2 WHERE id=1
COMMIT TRAN

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
3#
发表于 2008-6-18 14:59 | 只看该作者
嗯,高。。。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表