当RESOURCE_TYPE为“OBJECT”时,我一直在尝试理解SYS.DM_TRAN_LOCKS的RESOURCE_ASSOCIATED_ENTITY_ID列中的一些奇怪值。虽然这些应该是对象ID,但我无法确定它们实际引用的对象。
我已经尝试了我能想到的一切,包括使用INT和BIGINT类型的列查询所有系统表,以查看是否可以找到该值。没运气。有趣的值实际上出现在SYS.DM_TRAN_LOCKS,SYS.SYSLOCKINFO和SP_LOCK中。
(Microsoft SQL Server标准版(64位),版本9.00.4053.00(SP3 +安全补丁))
答案 0 :(得分:2)
select db_name(resource_database_id),object_name(resource_associated_entity_id),* from sys.dm_tran_locks
where request_session_id is not null
and resource_associated_entity_id <> 0
select db_name(resource_database_id),object_name(resource_associated_entity_id),* from sys.dm_tran_locks
where request_session_id is not null
and db_name(resource_database_id)='SamsungeStore'
and resource_associated_entity_id <> 0
答案 1 :(得分:1)
它可以返回对象ID,Hobt ID或分配单元ID。
对象可以是数据表,视图,存储过程,扩展存储过程或具有对象ID的任何其他对象。
可以尝试OBJECTPROPERTYEX(ID,PROPERTY)。有关示例,请参见2008联机丛书。
答案 2 :(得分:1)
我发现了这个查询,其中RESOURCE_ASSOCIATED_ENTITY_ID被解码和使用 基于resource_type,在某些情况下我注意到它无法解码。
/* LOCK MONITOR ON CURRENT schema connections */
Select
GETDATE() as Current_Time1,
es.session_id,
db_name(sp.dbid) As DatabaseName,
es.status,
substring((Select text
From sys.dm_exec_sql_text(sp.sql_handle)),1,128) As LastSQLText,
es.host_name,
es.login_time,
es.login_name,
es.program_name,
Convert(float, Round((IsNull(es.cpu_time, 0.0) / 1000.00),0)) As CPU_Time_in_seconds,
Convert(float, Round((IsNull(es.lock_timeout, 0.0) / 1000.00),0)) as lock_timeout_in_seconds,
tl.resource_type As LockType,
tl.request_mode,
tl.resource_associated_entity_id,
CASE
WHEN tl.resource_type = 'OBJECT'
THEN OBJECT_NAME(tl.resource_associated_entity_id)
WHEN tl.resource_type IN ('KEY', 'PAGE', 'RID')
THEN ( SELECT object_name(object_id)
FROM sys.partitions ps1
WHERE ps1.hobt_id=tl.resource_associated_entity_id
)
ELSE 'n.a.'
END AS ObjectName,
tl.request_status As LockStatus,
ec.connect_time,
ec.net_transport,
ec.client_net_address,
er.connection_id,
Case er.blocking_session_id
When 0 Then 'Not Blocked'
When -2 Then 'Orphaned Distributed Transaction'
When -3 Then 'Deferred Recovery Transaction'
When -4 Then 'Latch owner not determined'
Else ''
End As Blocking_Type,
er.wait_type,
Convert(float, Round((IsNull(er.wait_time, 0.0) /
1000.00),0)) As Wait_Time_in_seconds,
er.percent_complete,
er.estimated_completion_time,
Convert(float, Round((IsNull(er.total_elapsed_time, 0.0)
/ 1000.00),0)) As Total_Elapsed_Time_in_seconds,
Case er.transaction_isolation_level
When 0 Then 'Unspecified'
When 1 Then 'ReadUncomitted'
When 2 Then 'ReadCommitted'
When 3 Then 'Repeatable'
When 4 Then 'Serializable'
When 5 Then 'Snapshot'
Else ''
End transaction_isolation_level
From master.sys.dm_exec_sessions es
Inner Join master.sys.sysprocesses sp
On sp.spid = es.session_id
Left Join master.sys.dm_exec_connections ec
On ec.session_id = es.session_id
Left Join master.sys.dm_exec_requests er
On er.session_id = es.session_id
Left Join master.sys.dm_tran_locks tl
On tl.request_session_id = es.session_id
Where es.session_id <> @@spid
And es.session_id = es.session_id
And sp.dbid = DB_ID() /* CURRENT DB TO MONITOR */
And tl.resource_type <> 'DATABASE';
raiserror( '- ', 10, 3 ) with nowait;
WAITFOR DELAY '00:00:30';
GO 30
答案 3 :(得分:0)
AJM表示,当RESOURCE_TYPE为OBJECT时,他正在看到这些未知对象ID。根据联机丛书,在这种情况下,RESOURCE_ASSOCIATED_ENTITY_ID的内容应该是对象ID(不是Hobt ID或分配单元ID)。实际的措辞是“表示数据库对象。这可以是数据表,视图,存储过程,扩展存储过程或具有对象ID的任何对象”。
但是,我能够在我的环境中重新创建问题(SQL Server 2005 Developer Edition版本9.00.3282.00,SP1)。我已经尝试了OBJECTPROPERTYEX建议,但它也返回NULL。再次,这表明神秘对象不是模式范围的,但不幸的是我也无法弄清楚它们是什么。