Странные значения в столбце SYS.DM_TRAN_LOCKS таблицы RESOURCE_ASSOCIATED_ENTITY_ID - PullRequest
2 голосов
/ 02 июня 2010

Я пытался понять некоторые странные значения в столбце RESOURCE_ASSOCIATED_ENTITY_ID в SYS.DM_TRAN_LOCKS, когда RESOURCE_TYPE имеет значение «OBJECT». Хотя это должны быть идентификаторы объектов, я не могу определить, к какому объекту они действительно относятся.

Я перепробовал все, что мог, включая запросы ко всем системным таблицам со столбцами типа INT и BIGINT, чтобы узнать, смогу ли я найти значение. Неудачно. Смешные значения на самом деле появляются в SYS.DM_TRAN_LOCKS, SYS.SYSLOCKINFO и SP_LOCK.

(Microsoft SQL Server Standard Edition (64-разрядная версия), версия 9.00.4053.00 (SP3 + исправление безопасности))

Ответы [ 4 ]

2 голосов
/ 30 мая 2014
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 голос
/ 27 июля 2011

Я нашел этот запрос, где 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
1 голос
/ 03 июня 2010

Может возвращать идентификатор объекта, идентификатор Hobt или идентификатор единицы распределения.

Объектами могут быть таблица данных, представление, сохраненный процесс, расширенный сохраненный процесс или любой другой объект, имеющий идентификатор объекта.

Может попробовать OBJECTPROPERTYEX (ID, НЕДВИЖИМОСТЬ). См. 2008 Books Online для примеров.

0 голосов
/ 08 июня 2010

AJM заявил, что он видит эти неизвестные идентификаторы объекта, когда RESOURCE_TYPE равен OBJECT. В соответствии с Книгой онлайн, содержание RESOURCE_ASSOCIATED_ENTITY_ID должно быть идентификатором объекта (не идентификатором Hobt или идентификатором единицы распределения) в этом случае. Фактическая формулировка: «Представляет объект базы данных. Это может быть таблица данных, представление, хранимая процедура, расширенная хранимая процедура или любой объект с идентификатором объекта».

Однако я могу воссоздать проблему в своей среде (SQL Server 2005 Developer Edition версия 9.00.3282.00, SP1). Я пробовал предложение OBJECTPROPERTYEX, но оно также возвращает NULL. Опять же, это говорит о том, что таинственные объекты не ограничены схемой, но, к сожалению, я также не могу понять, что они собой представляют.

...