如何检查锁是表还是行?

时间:2016-04-07 12:08:07

标签: sql sql-server

我想检查会话是否持有表锁或行锁。

我可以看到sys.dm_tran_locks没有显示这种详细程度。

有没有办法识别这个?

2 个答案:

答案 0 :(得分:1)

您也可以使用此查询,它将为您提供大量信息,如用户名,SQL,数据库,资源类型等:

SELECT DTL.[request_session_id] AS [session_id]
    ,DB_NAME(DTL.[resource_database_id]) AS [Database]
    ,DTL.resource_type
    ,CASE 
        WHEN DTL.resource_type IN (
                'DATABASE'
                ,'FILE'
                ,'METADATA'
                )
            THEN DTL.resource_type
        WHEN DTL.resource_type = 'OBJECT'
            THEN OBJECT_NAME(DTL.resource_associated_entity_id, DTL.[resource_database_id])
        WHEN DTL.resource_type IN (
                'KEY'
                ,'PAGE'
                ,'RID'
                )
            THEN (
                    SELECT OBJECT_NAME([object_id])
                    FROM sys.partitions
                    WHERE sys.partitions.hobt_id = DTL.resource_associated_entity_id
                    )
        ELSE 'Unidentified'
        END AS [Parent Object]
    ,DTL.request_mode AS [Lock Type]
    ,DTL.request_status AS [Request Status]
    ,DER.[blocking_session_id]
    ,DES.[login_name]
    ,CASE DTL.request_lifetime
        WHEN 0
            THEN DEST_R.TEXT
        ELSE DEST_C.TEXT
        END AS [Statement]
FROM sys.dm_tran_locks DTL
LEFT JOIN sys.[dm_exec_requests] DER ON DTL.[request_session_id] = DER.[session_id]
INNER JOIN sys.dm_exec_sessions DES ON DTL.request_session_id = DES.[session_id]
INNER JOIN sys.dm_exec_connections DEC ON DTL.[request_session_id] = DEC.[most_recent_session_id]
OUTER APPLY sys.dm_exec_sql_text(DEC.[most_recent_sql_handle]) AS DEST_C
OUTER APPLY sys.dm_exec_sql_text(DER.sql_handle) AS DEST_R
WHERE DTL.[resource_database_id] = DB_ID()
    AND DTL.[resource_type] NOT IN (
        'DATABASE'
        ,'METADATA'
        )
ORDER BY DTL.[request_session_id];

答案 1 :(得分:0)

尝试sp_lock。您可以在名为TYPE的列下查看锁定级别。

如果是TAB则表级锁定。如果是RID则行级锁定。

同样地,

KEY =在一个索引中锁定,该索引保护可序列化事务中的一系列键。

PAG =锁定数据或索引页面。

EXT =锁定范围。

TAB =锁定整个表,包括所有数据和索引。

DB =锁定数据库。

FIL =锁定数据库文件。

APP =锁定应用程序指定的资源。

MD =锁定元数据或目录信息。

HBT =锁定堆或B树索引。此信息在SQL Server中不完整。

AU =锁定分配单元。此信息在SQL Server中不完整。

请参阅链接了解更多详情 - > https://msdn.microsoft.com/en-IN/library/ms187749.aspx