Sql 如何检查桌子上有哪些锁

Sql 如何检查桌子上有哪些锁,sql,sql-server,database,performance,sql-server-2005,Sql,Sql Server,Database,Performance,Sql Server 2005,我们如何根据查询批次检查哪些数据库锁应用于哪些行 有实时突出显示表行级锁定的工具吗 DB:SQL Server 2005这并没有确切地显示哪些行被锁定,但这可能会对您有所帮助 通过运行以下命令,可以检查哪些语句被阻止: select cmd,* from sys.sysprocesses where blocked > 0 它还会告诉你每个街区在等什么。因此,您可以一直跟踪它,以查看哪个语句导致了第一个块,哪个语句导致了其他块 编辑以从以下位置添加注释: 阻塞列表示阻塞进程的spid。您

我们如何根据查询批次检查哪些数据库锁应用于哪些行

有实时突出显示表行级锁定的工具吗


DB:SQL Server 2005

这并没有确切地显示哪些行被锁定,但这可能会对您有所帮助

通过运行以下命令,可以检查哪些语句被阻止:

select cmd,* from sys.sysprocesses
where blocked > 0
它还会告诉你每个街区在等什么。因此,您可以一直跟踪它,以查看哪个语句导致了第一个块,哪个语句导致了其他块

编辑以从以下位置添加注释:


阻塞列表示阻塞进程的spid。您可以运行kill{spid}来修复它


您还可以使用内置的
sp_who2
存储过程获取SQL Server实例上的当前阻塞和阻塞进程。通常,您会在SQL探查器实例旁边运行此命令,以查找阻塞进程,并查看spid在探查器中发出的最新命令。

要添加到其他响应中,
sp_lock
还可以用于转储所有正在运行的进程的完全锁定信息。输出可能会非常强大,但是如果您想确切地知道锁定了什么,那么运行它是非常有价值的。我通常将它与
sp_who2
一起使用,以快速解决锁定问题

“friendlier”
sp_lock
过程有多个不同版本,具体取决于所讨论的SQL Server版本


在您的示例中,对于SQL Server 2005,
sp_lock
仍然可用,但已被弃用,因此现在建议使用该视图进行此类操作。您可以找到如何“滚动您自己的”sp_锁定功能的示例。

我使用动态管理视图(DMV)捕获锁定以及锁定项目的对象id或分区id

(必须切换到要观察的数据库才能获取对象id)


您可以通过以下查询在表上找到当前的

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

如果存在同一请求\u所有者\u类型的多个实例,则使用请求\u所有者\u id列来区分每个实例。对于分布式事务,请求所有者类型和请求所有者guid列将显示不同的实体信息


例如,会话S1拥有表1上的共享锁;在会话S1下运行的事务T1也拥有表1上的共享锁。在这种情况下,sys.dm\u tran\u locks返回的resource\u description列将显示同一资源的两个实例。请求\u所有者\u类型列将一个实例显示为会话,另一个实例显示为事务。另外,资源\u所有者\u id列将具有不同的值。

您可以通过下面的脚本找到详细信息

-- List all Locks of the Current Database 
SELECT TL.resource_type AS ResType 
      ,TL.resource_description AS ResDescr 
      ,TL.request_mode AS ReqMode 
      ,TL.request_type AS ReqType 
      ,TL.request_status AS ReqStatus 
      ,TL.request_owner_type AS ReqOwnerType 
      ,TAT.[name] AS TransName 
      ,TAT.transaction_begin_time AS TransBegin 
      ,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura 
      ,ES.session_id AS S_Id 
      ,ES.login_name AS LoginName 
      ,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName 
      ,PARIDX.name AS IndexName 
      ,ES.host_name AS HostName 
      ,ES.program_name AS ProgramName 
FROM sys.dm_tran_locks AS TL 
     INNER JOIN sys.dm_exec_sessions AS ES 
         ON TL.request_session_id = ES.session_id 
     LEFT JOIN sys.dm_tran_active_transactions AS TAT 
         ON TL.request_owner_id = TAT.transaction_id 
            AND TL.request_owner_type = 'TRANSACTION' 
     LEFT JOIN sys.objects AS OBJ 
         ON TL.resource_associated_entity_id = OBJ.object_id 
            AND TL.resource_type = 'OBJECT' 
     LEFT JOIN sys.partitions AS PAR 
         ON TL.resource_associated_entity_id = PAR.hobt_id 
            AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') 
     LEFT JOIN sys.objects AS PAROBJ 
         ON PAR.object_id = PAROBJ.object_id 
     LEFT JOIN sys.indexes AS PARIDX 
         ON PAR.object_id = PARIDX.object_id 
            AND PAR.index_id = PARIDX.index_id 
WHERE TL.resource_database_id  = DB_ID() 
      AND ES.session_id <> @@Spid -- Exclude "my" session 
      -- optional filter  
      AND TL.request_mode <> 'S' -- Exclude simple shared locks 
ORDER BY TL.resource_type 
        ,TL.request_mode 
        ,TL.request_type 
        ,TL.request_status 
        ,ObjectName 
        ,ES.login_name;



--TSQL commands
SELECT 
       db_name(rsc_dbid) AS 'DATABASE_NAME',
       case rsc_type when 1 then 'null'
                             when 2 then 'DATABASE' 
                             WHEN 3 THEN 'FILE'
                             WHEN 4 THEN 'INDEX'
                             WHEN 5 THEN 'TABLE'
                             WHEN 6 THEN 'PAGE'
                             WHEN 7 THEN 'KEY'
                             WHEN 8 THEN 'EXTEND'
                             WHEN 9 THEN 'RID ( ROW ID)'
                             WHEN 10 THEN 'APPLICATION' end  AS 'REQUEST_TYPE',

       CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
                                     WHEN 2 THEN 'CURSOR'
                                     WHEN 3 THEN 'SESSION'
                                     WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',

       OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME', 
       PROCESS.HOSTNAME , 
       PROCESS.program_name , 
       PROCESS.nt_domain , 
       PROCESS.nt_username , 
       PROCESS.program_name ,
       SQLTEXT.text 
FROM sys.syslockinfo LOCK JOIN 
     sys.sysprocesses PROCESS
  ON LOCK.req_spid = PROCESS.spid
CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
where 1=1
and db_name(rsc_dbid) = db_name()



--Lock on a specific object
SELECT * 
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID()
AND resource_associated_entity_id = object_id('Specific Table');
——列出当前数据库的所有锁
选择TL.resource\u type作为重新类型
,TL.resource\u描述为ResDescr
,TL.request_模式为ReqMode
,TL.request_类型为requesttype
,TL.request_状态为ReqStatus
,TL.request_owner_type作为requownerType
,TAT.[name]作为TransName
,TAT.transaction_begin_时间为TransBegin
,DATEDIFF(ss,TAT.transaction\u begin\u time,GETDATE())作为TransDura
,ES.session_id作为S_id
,ES.login_name作为LoginName
,合并(OBJ.name,PAROBJ.name)作为ObjectName
,PARIDX.name作为索引名
,ES.host_name作为主机名
,ES.program\u name作为程序名
从sys.dm_传输锁定为TL
内部连接sys.dm_exec_会话作为ES
在TL.request\u session\u id=ES.session\u id上
左连接sys.dm\u将活动事务转换为TAT
在TL.request\u owner\u id=TAT.transaction\u id上
和TL.request_owner_type='TRANSACTION'
将sys.objects作为对象左连接
在TL.resource\u associated\u entity\u id=OBJ.object\u id上
和TL.resource_type='OBJECT'
左连接SysAs分区为PAR
关于Ty.RealthCyAsAssixIn
和TL.resource_输入('PAGE','KEY','RID','HOBT'))
将sys.objects作为PAROBJ左连接
关于PAR.ObjistId= PAROB.ObjutsID
左连接sys.index作为PARIDX
关于PAR.ObjistId= PARIDX.ObjutsID
和PAR.IXXXIDID= PARIDX.
其中TL.resource_database_id=DB_id()
和ES.session_id@@Spid--排除“我的”会话
--可选过滤器
和TL.request_模式“S”-排除简单共享锁
按TL.resource\u类型排序
,TL.request_模式
,TL.request\u类型
,TL.request_状态
,ObjectName
,e.login_name;
--TSQL命令
挑选
数据库名称(rsc\U dbid)为“数据库名称”,
案例rsc_类型为1,然后为“null”
当2时,则为“数据库”
当3时,则“文件”
当4时,则为“索引”
当5时,然后是“桌子”
当6时,然后“翻页”
当7时,则“键”
当8时,则“扩展”
当9时,则为“RID(行ID)”
当10时,则“应用程序”以“请求类型”结束,
案例请求\u所有者类型为1时,然后为“交易”
当2时,则为“游标”
当3时,则“会话”
当4时,则“ExSESSION”以“REQUEST_OWNERTYPE”结束,
对象名称(rsc_objid,rsc_dbid)为“对象名称”,
PROCESS.HOSTNAME,
PROCESS.program_名称,
PROCESS.nt_域,
PROCESS.nt\u用户名,
PROCESS.program_名称,
SQLTEXT.text
从sys.syslockinfo锁联接
sys.sysprocesss进程
ON LOCK.req_spid=PROCESS.spid
交叉应用sys.dm\u exec\u sql\u text(PROCESS.sql\u HANDLE)SQLTEXT
其中1=1
和db_名称(
-- List all Locks of the Current Database 
SELECT TL.resource_type AS ResType 
      ,TL.resource_description AS ResDescr 
      ,TL.request_mode AS ReqMode 
      ,TL.request_type AS ReqType 
      ,TL.request_status AS ReqStatus 
      ,TL.request_owner_type AS ReqOwnerType 
      ,TAT.[name] AS TransName 
      ,TAT.transaction_begin_time AS TransBegin 
      ,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura 
      ,ES.session_id AS S_Id 
      ,ES.login_name AS LoginName 
      ,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName 
      ,PARIDX.name AS IndexName 
      ,ES.host_name AS HostName 
      ,ES.program_name AS ProgramName 
FROM sys.dm_tran_locks AS TL 
     INNER JOIN sys.dm_exec_sessions AS ES 
         ON TL.request_session_id = ES.session_id 
     LEFT JOIN sys.dm_tran_active_transactions AS TAT 
         ON TL.request_owner_id = TAT.transaction_id 
            AND TL.request_owner_type = 'TRANSACTION' 
     LEFT JOIN sys.objects AS OBJ 
         ON TL.resource_associated_entity_id = OBJ.object_id 
            AND TL.resource_type = 'OBJECT' 
     LEFT JOIN sys.partitions AS PAR 
         ON TL.resource_associated_entity_id = PAR.hobt_id 
            AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') 
     LEFT JOIN sys.objects AS PAROBJ 
         ON PAR.object_id = PAROBJ.object_id 
     LEFT JOIN sys.indexes AS PARIDX 
         ON PAR.object_id = PARIDX.object_id 
            AND PAR.index_id = PARIDX.index_id 
WHERE TL.resource_database_id  = DB_ID() 
      AND ES.session_id <> @@Spid -- Exclude "my" session 
      -- optional filter  
      AND TL.request_mode <> 'S' -- Exclude simple shared locks 
ORDER BY TL.resource_type 
        ,TL.request_mode 
        ,TL.request_type 
        ,TL.request_status 
        ,ObjectName 
        ,ES.login_name;



--TSQL commands
SELECT 
       db_name(rsc_dbid) AS 'DATABASE_NAME',
       case rsc_type when 1 then 'null'
                             when 2 then 'DATABASE' 
                             WHEN 3 THEN 'FILE'
                             WHEN 4 THEN 'INDEX'
                             WHEN 5 THEN 'TABLE'
                             WHEN 6 THEN 'PAGE'
                             WHEN 7 THEN 'KEY'
                             WHEN 8 THEN 'EXTEND'
                             WHEN 9 THEN 'RID ( ROW ID)'
                             WHEN 10 THEN 'APPLICATION' end  AS 'REQUEST_TYPE',

       CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
                                     WHEN 2 THEN 'CURSOR'
                                     WHEN 3 THEN 'SESSION'
                                     WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',

       OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME', 
       PROCESS.HOSTNAME , 
       PROCESS.program_name , 
       PROCESS.nt_domain , 
       PROCESS.nt_username , 
       PROCESS.program_name ,
       SQLTEXT.text 
FROM sys.syslockinfo LOCK JOIN 
     sys.sysprocesses PROCESS
  ON LOCK.req_spid = PROCESS.spid
CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
where 1=1
and db_name(rsc_dbid) = db_name()



--Lock on a specific object
SELECT * 
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID()
AND resource_associated_entity_id = object_id('Specific Table');