我想检查会话是否持有表锁或行锁。
我可以看到sys.dm_tran_locks
没有显示这种详细程度。
有没有办法识别这个?
答案 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