2010-06-02 194 views
2

當RESOURCE_TYPE爲「OBJECT」時,我一直在嘗試瞭解SYS.DM_TRAN_LOCKS的RESOURCE_ASSOCIATED_ENTITY_ID列中的一些奇怪值。儘管這些應該是對象ID,但我無法確定它們實際引用的對象。SYS.DM_TRAN_LOCKS表中的奇怪值RESOURCE_ASSOCIATED_ENTITY_ID列

我用盡了一切我能想到的,包括詢問與類型INT和BIGINT的列的所有系統表,看看我能找到的值。沒有運氣。有趣的值實際上出現在SYS.DM_TRAN_LOCKS,SYS.SYSLOCKINFO和SP_LOCK中。

(Microsoft SQL Server的標準版(64位),9.00.4053.00版本(SP3 +安全補丁))

+0

是什麼(選擇)OBJECT_NAME(RESOURCE_ASSOCIATED_ENTITY_ID)返回? – edosoft 2010-06-02 14:02:27

+0

它返回NULL。我嘗試將RESOURCE_DATABASE_ID列的內容作爲第二個參數傳遞給OBJECT_NAME,但它沒有區別。 以下查詢返回OBJECT_NAME的一些值,但不是其他值,因爲ID似乎並不涉及模式範圍的對象,所以它們不存在於sys.all_objects中。他們可能會引用非模式範圍的對象,但關於如何查找所有非模式範圍的對象的信息非常少。 SELECT OBJECT_NAME(resource_associated_entity_id,resource_database_id)AS object_name,* FROM sys.dm_tran_locks WHERE resource_type ='OBJECT' – AJM 2010-06-02 14:35:55

回答

1

它可以返回對象ID,HOBT ID,或分配單元ID。

的對象可以是數據表,視圖,存儲過程,擴展存儲過程,或具有一個Object ID的任何其他對象。

可能嘗試OBJECTPROPERTYEX(ID,PROPERTY)。有關示例,請參閱2008聯機叢書。

0

AJM聲明他在RESOURCE_TYPE爲OBJECT時看到這些未知的對象ID。根據聯機叢書,在這種情況下,RESOURCE_ASSOCIATED_ENTITY_ID的內容應該是對象標識(不是霍布特標識或分配單元標識)。實際的措辭是「表示數據庫對象,它可以是數據表,視圖,存儲過程,擴展存儲過程或任何帶有對象ID的對象」。

但是,我能夠重新在我的環境(SQL Server 2005開發版版本9.00.3282.00,SP1)的問題。我試過OBJECTPROPERTYEX建議,但它也返回NULL。同樣,這表明神祕對象不是模式範圍的,但不幸的是,我也無法弄清楚它們是什麼。

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 
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