| [原创] 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
你觉得本精华贴如何? 请给本精华贴打分

|
|
* 游客不能打分。
|
|
|

-
[原创] SQL Server锁信息监视/查询
- yuyong2 2006-3-10 13:23:56 [ID:2566789 点击:550] (3621 Bytes) (4)
-
太好了 <无内容> - 瘋子老婆 2006-3-15 11:33:36 [ID:2567035 点击:1595] (0 Bytes) (0)
-
好文章呀! <无内容> - dk163 2006-3-15 10:56:33 [ID:2567034 点击:1565] (0 Bytes) (0)
-
呵呵,汉化sp_lock呀 <无内容> - 怡红公子 2006-3-15 0:16:57 [ID:2567013 点击:1502] (0 Bytes) (0)
-
支持原创,UP。 <无内容> - 潇湘剑公子 2006-3-10 14:02:33 [ID:2566796 点击:1619] (0 Bytes) (0)