sql server锁检测

有时候系统运行老感受效率不高,而且有时候sql还有超时的报错,可是并发量并不高。经过排查定位sql是否有执行效率问题sql

 

-- 开事务, 以保持锁
BEGIN TRAN

-- 更新
update table a 
set column1 = 1 
where idx = 1

-- 列出锁信息
EXEC sp_lock @@spid

-- 提交或者回滚事务
COMMIT/ROLLBACK TRAN

经过执行sp_lock存储过程,查看锁信息(相似以下)数据库

spid dbid ObjId IndId Type Resource Mode Status
52 8 0 0 DB                                  S GRANT
52 1 1.12E+09 0 TAB                                  IS GRANT
52 8 9.18E+08 1 PAG 1:425705                         IX GRANT
52 8 9.18E+08 0 TAB                                  IX GRANT
52 8 9.18E+08 1 KEY -1E+10 X GRANT

经过 dbid, ObjId 能够找到你更新的表相关的锁记录
若是 IndId 为 0 , 表示锁在表上, 不然在对应的索引上
经过 Type 列, 能够肯定被锁定的是行/表, 或者是其余, 而且能够经过 Mode 看到是什么锁
在Status 中, 还能够看到锁是已经加上了, 仍是在等待其余资源释放(以取得加锁的权利)

spid   dbid   ObjId       IndId  Type Resource                   Mode     Status
------ ------ ----------- ------ ---- -------------------------- -------- ------
53     1      1115151018  0      TAB                             IS       GRANT并发

 

 

锁的类型(Tyep 列值, RID 和 KEY 的话, 表示锁在行上) 有以下几种:
RID = 表中单个行的锁,由行标识符 (RID) 标识。
KEY = 索引内保护可串行事务中一系列键的锁。
PAG = 数据页或索引页的锁。
EXT = 对某区的锁。
TAB = 整个表(包括全部数据和索引)的锁。
DB = 数据库的锁。
FIL = 数据库文件的锁。
APP = 指定的应用程序资源的锁。
MD = 元数据或目录信息的锁。
HBT = 堆或 B 树索引的锁。在 SQL Server 2005 中此信息不完整。
AU = 分配单元的锁。在 SQL Server 2005 中此信息不完整。spa

 

显示的结果没法知道是哪一个对象,能够使用下面的语句来查看
Select * From sysdatabases where dbid=[dbid]   --数据库
Select * from sysobjects where id=[ObjId]      --表或其余对象
Select * from sysindexes where id=[IndId]      --索引
--此处[]内为表中对应列的值code

相关文章
相关标签/搜索