·RSS订阅本站
Dev-club通告
·Dev-Club开始提供RSS订阅
·Dev-Club博客开通,现在开通即可获得50兆文件上传空间
[原创] SQL Server锁信息监视/查询  >>

yuyong2 于 2006-3-10 13:23:56 加贴在 数据库 ←返回版面按此给该网友发送邮件 按此察看该网友的资料 按此把文章加入书签 按此给作者留言 按此给作者发送即时消息 按此查看作者个人专辑 按此打印本帖 按此打包转发本帖

对于网站或并发量大的业务中,数据库死锁是较为常见和烦恼的事了.如果你期待看了此文可以解决问题----那是不可能的 :) ,但是此文将提供一个监视或者查询的方法,也算尽点微薄之力吧!

以下可以适应sql server 2000以上数据库服务器,并且需要对服务器具有 VIEW SERVER STATE 权限。

1。数据库锁信息表
create table LOCK_INFO(
RES_TEXT nchar(32),
RES_BIN  binary(16),
DBID smallint,
IND_ID smallint,
OBJ_ID int,
RES_TYPE tinyint,
RES_FLAG tinyint,
REQ_MODE tinyint,
REQ_STATUS tinyint,
REQ_REFCNT tinyint,
SP_ID int,
ECID int,
OWNER_TYPE smallint,
BLOCKED int,
CMD nchar(16),
CONTEXT_INFO binary(128),
CREATED_DATE datetime not null default getdate()
)
go

2。为了更容易阅读和观察,建如下视图
drop view LOCK_INFO_HISTORY_VIEW
go
create view LOCK_INFO_HISTORY_VIEW
as
select L.RES_TEXT, DB_NAME(L.DBID) as DATABASE_NAME,
case L.IND_ID
when 0 then '--'
else (select [name] from sysindexes where indid = L.IND_ID)
end as INDEX_NAME,
case L.OBJ_ID
when 0 then 'unknow'
else (select [name] from sysobjects where id = L.OBJ_ID)
end as OBJ_NAME,
case L.RES_TYPE
  when 1 then 'NULL 资源(未使用)'
  when 2 then '数据库'
  when 3 then '文件'
  when 4 then '索引'
  when 5 then '表'
  when 6 then '页'
  when 7 then '键'
  when 8 then '区'
  when 9 then 'RID 行ID'
  when 10 then '应用程序'
end as RESOURCE_TYPE,
case L.REQ_MODE
  when 0 then '不授权访问资源'
  when 1 then 'Sch-S(架构稳定性)'
  when 2 then 'Sch-M(架构修改)'
  when 3 then 'S(共享)'
  when 4 then 'U(更新)'
  when 5 then 'X: 排它'
  when 6 then 'IS: 意向共享'
  when 7 then 'IU: 意向Update'
  when 8 then 'IX: Intent Exclusive'
  when 9 then 'SIU: 共享意向更新'
  when 10 then 'SIX: Shared Intent Exclusive'
  when 11 then 'UIX: Update Intent Exclusive'
  when 12 then 'BU: 由大容量操作使用'
  when 13 then 'RangeS_S: 共享键范围和共享资源锁'
  when 14 then 'RangeS_U: Shared Key-Range and Update Resource lock'
  when 15 then 'RangeI_N: 插入键范围和空资源锁'
  when 16 then 'RangeI_S: 通过 RangeI_N 和 S 锁的重叠创建的键范围转换锁'
  when 17 then 'RangeI_U: 通过 RangeI_N 和 U 锁的重叠创建的键范围转换锁'
  when 18 then 'RangeI_X: 通过 RangeI_N 和 X 锁的重叠创建的键范围转换锁'
  when 19 then 'RangeX_S: 通过 RangeI_N 和 RangeS_S 锁的重叠创建的键范围转换锁'
  when 20 then 'RangeX_U: 通过 RangeI_N 和 RangeS_U 锁的重叠创建的键范围转换锁'
  when 21 then 'RangeX_X: (排他键范围和排他资源锁)'
End as REQ_MODE,
case L.REQ_STATUS
  when 1 then '已授予'
  when 2 then '正在转换'
  when 3 then '正在等待'
end as REQ_STATUS,
L.REQ_REFCNT as REFERENCES_CNT, L.SP_ID, L.BLOCKED, L.ECID as EXEC_THREAD_ID,
case L.OWNER_TYPE
  when 1 then '事务'
  when 2 then '游标'
  when 3 then '会话'
  when 4 then 'ExSession'
end as OWNER_TYPE,
L.CMD,L.CREATED_DATE
from LOCK_INFO L

3.填充或监视数据库锁信息,较简单的办法是写一段vbs执行一下下面的sql,然后加为一个任务计划.
insert into LOCK_INFO(RES_TEXT,RES_BIN,DBID,IND_ID,OBJ_ID,RES_TYPE,RES_FLAG,REQ_MODE,REQ_STATUS,REQ_REFCNT,SP_ID,ECID,OWNER_TYPE,BLOCKED,CMD,CONTEXT_INFO)
select i.rsc_text, i.rsc_bin, i.rsc_dbid,i.rsc_indid,i.rsc_objid,i.rsc_type, i.rsc_flag,i.req_mode,i.req_status,i.req_refcnt,i.req_spid,i.req_ecid,
i.req_ownertype, s.blocked,s.cmd,s.context_info
from master..sysprocesses s inner join master..syslockinfo i on s.spid = i.req_spid
where (s.blocked > 0 or s.spid in (select distinct blocked from master..sysprocesses where blocked > 0))
and s.loginame = '你的要监视的应用的登录名' and s.program_name = '访问数据库的应用程序名,如jdbc中的"jTDS"'
go

4。三步就ok了,第四步留下你的评论吧 ^_^


计算机世界开发者俱乐部 http://dev-club.esnai.com

你觉得本精华贴如何? 请给本精华贴打分

  0 1 2 3 4 5
一塌糊涂   妙不可言
* 游客不能打分。
打分结果:
总分0 0次
0 1 2 3 4 5
0人给本贴打过分

相关帖子  >>
回复这个精华帖
版面: 数据库  ←返回版面  >>


你还没有登录! 第一次发言请去注册
* 用户名: * 密码: 下次自动登录 密码遗忘?
* 校验码: 请在验证码框输入
  Email: 回复请Email通知 如果不填写则取注册Email
* 主题: (还可以输入100字节) 不能正常发言?  
    * 如果你是要向他人求助,请把主题类型设置为“求助” 如何在社区提问?  怎么在帖子里面发布音乐、视频信息?  
  表情:  
   
   
  内容(最多16KB): 签名 设置  发言注意事项↓ ALT+S发送
   

  上传附件:  
    允许的文件类型:JPG,GIF,ZIP,RAR,最大不能超过2048KB)
图片缩小的工具,如果您上传的JPEG图片比较大,建议您使用这个工具作尺寸调整
 
  链接地址:  
  链接标题:  
  链接图片:  

注意: 在计算机世界开发者俱乐部发言之前您必须仔细阅读并同意下列条款:
·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
·严禁发表危害国家安全、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的作品
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·计算机世界开发者俱乐部各栏目的版主有权保留或删除其管辖论坛中的任意内容
·您在计算机世界开发者俱乐部发表的作品,计算机世界开发者俱乐部有权在网站内免费转载或引用
发言注意事项:
·带有*号的内容为必填内容
·只有本版版主或积分大于50的人才可以帖图哦!
·怎样使用ABC代码

Dev-club通告
·Dev-Club开始提供RSS订阅
·Dev-Club博客开通,现在开通即可获得50兆文件上传空间