2012-06-20 9 views
8

Sto catturando eventi locks_lock_timeouts_greater_than_0 utilizzando eventi estesi in SQL Server. La sessione dell'evento è la seguente:Come ottenere il proprietario e l'oggetto bloccato dall'evento locks_lock_timeouts_greater_than_0 in SQL Server?

CREATE EVENT SESSION MyQuery ON SERVER 
    ADD EVENT sqlserver.locks_lock_timeouts_greater_than_0 
    (
     ACTION (sqlserver.sql_text, sqlserver.tsql_stack) 
    ) 
    ADD TARGET package0.ring_buffer (SET max_memory = 4096) 
    WITH (max_dispatch_latency = 1 seconds) 

Come determinare l'oggetto bloccato e chi lo sta bloccando?

UPDATE: Ho bisogno di questo per SQL Server 2008. Come eseguire il debug timeout di blocco su versioni pre-2012?

risposta

2

Sembra che l'informazione desiderata non venga catturata da questo evento.

Si può vedere quali sono disponibili i campi per un evento con:

select p.name package_name, o.name event_name, c.name event_field, c.type_name field_type, c.column_type column_type 
from sys.dm_xe_objects o 
join sys.dm_xe_packages p 
     on o.package_guid = p.guid 
join sys.dm_xe_object_columns c 
     on o.name = c.object_name 
where o.object_type = 'event' 
    AND o.name = 'locks_lock_timeouts_greater_than_0' 
order by package_name, event_name 

il risultato è:

sqlserver locks_lock_timeouts_greater_than_0 ID uint16 readonly 
sqlserver locks_lock_timeouts_greater_than_0 UUID guid_ptr readonly 
sqlserver locks_lock_timeouts_greater_than_0 VERSION uint8 readonly 
sqlserver locks_lock_timeouts_greater_than_0 CHANNEL etw_channel readonly 
sqlserver locks_lock_timeouts_greater_than_0 KEYWORD keyword_map readonly 
sqlserver locks_lock_timeouts_greater_than_0 count uint64 data 
sqlserver locks_lock_timeouts_greater_than_0 lock_type uint64 data 

Tuttavia, in SQL 2012 questo evento è stato sostituito (http://msdn.microsoft.com/en-us/library/ms144262.aspx) di lock_timeout_greater_than_0 che ha il seguente set di campi

sqlserver lock_timeout_greater_than_0 UUID guid_ptr readonly 
sqlserver lock_timeout_greater_than_0 VERSION uint8 readonly 
sqlserver lock_timeout_greater_than_0 CHANNEL etw_channel readonly 
sqlserver lock_timeout_greater_than_0 KEYWORD keyword_map readonly 
sqlserver lock_timeout_greater_than_0 collect_resource_description boolean customizable 
sqlserver lock_timeout_greater_than_0 collect_database_name boolean customizable 
sqlserver lock_timeout_greater_than_0 resource_type lock_resource_type data 
sqlserver lock_timeout_greater_than_0 mode lock_mode data 
sqlserver lock_timeout_greater_than_0 owner_type lock_owner_type data 
sqlserver lock_timeout_greater_than_0 transaction_id int64 data 
sqlserver lock_timeout_greater_than_0 database_id uint32 data 
sqlserver lock_timeout_greater_than_0 lockspace_workspace_id ptr data 
sqlserver lock_timeout_greater_than_0 lockspace_sub_id uint32 data 
sqlserver lock_timeout_greater_than_0 lockspace_nest_id uint32 data 
sqlserver lock_timeout_greater_than_0 resource_0 uint32 data 
sqlserver lock_timeout_greater_than_0 resource_1 uint32 data 
sqlserver lock_timeout_greater_than_0 resource_2 uint32 data 
sqlserver lock_timeout_greater_than_0 object_id int32 data 
sqlserver lock_timeout_greater_than_0 associated_object_id uint64 data 
sqlserver lock_timeout_greater_than_0 duration uint64 data 
sqlserver lock_timeout_greater_than_0 resource_description unicode_string data 
sqlserver lock_timeout_greater_than_0 database_name unicode_string data 

Da questo ero abl e per ricavare il database (database_id) e nella mia tabella case (variamente in object_id, associated_object_id, resource_0) dai loro Ids.

non ho visto un modo ovvio per trovare chi stava chiudendo l'oggetto dai dati acquisiti da questo evento.

EDIT - vedere SQL Server Lock Timeout Exceeded Deleting Records in a Loop per un esempio di utilizzo sp_lock e sp_who2 per eseguire il debug la causa di un evento di timeout di blocco.

+0

+1 Grazie per le informazioni sulle modifiche in SQL Server 2012. Sfortunatamente, ho bisogno di queste informazioni su SQL Server 2008. Forse qualcun altro troverà una soluzione alternativa per SQL Server 2008. –

+0

Perché hai impostato un timeout di blocco, normalmente aspetterà una quantità illimitata di tempo se non c'è un deadlock? – bkr

+0

L'applicazione ha un'interfaccia utente. –