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

相關文章
相關標籤/搜索