我正在处理一个查询,以判断给定会话中哪些对象具有锁定,但我遇到了一些阻塞问题。
这是我的基本查询:
SELECT request_session_id AS session_id,
request_owner_id AS transaction_id,
OBJECT_SCHEMA_NAME(resource_associated_entity_id, resource_database_id),
OBJECT_NAME(resource_associated_entity_id, resource_database_id),
COUNT(1) AS lock_count
FROM sys.dm_tran_locks WITH (NOLOCK)
WHERE resource_type = 'OBJECT'
GROUP BY request_session_id, request_owner_id,
resource_database_id, resource_associated_entity_id
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,我偶尔会被实际持有锁的会话之一阻止。如果我删除OBJECT_NAME和OBJECT_SCHEMA_NAME然后我没有任何问题。我试过将信息转储到一个表中,然后在有类似问题的表中使用这些值的函数。
这让我相信问题出在OBJECT_NAME和OBJECT_SCHEMA_NAME函数中,但我不确定为什么或如何解决它。我也不确定为什么我有时会被阻止有时不会。有没有人有什么建议?