SYS.DM_TRAN_LOCKS表RESOURCE_ASSOCIATED_ENTITY_ID列中的奇怪值

时间:2010-06-02 12:07:22

标签: sql sql-server sql-server-2005 sql-server-2008 locking

当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 +安全补丁))

4 个答案:

答案 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。再次,这表明神秘对象不是模式范围的,但不幸的是我也无法弄清楚它们是什么。