2012-06-20 17 views
8

我在SQL Server中使用擴展事件捕獲locks_lock_timeouts_greater_than_0事件。活動會議如下:如何從SQL Server中的locks_lock_timeouts_greater_than_0事件獲取所有者和鎖定的對象?

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) 

我怎樣才能確定什麼對象被鎖定,誰當前鎖定它?

UPDATE:我需要SQL Server 2008.如何調試2012年以前版本的鎖定超時?

回答

2

看起來你想要的信息並沒有被這個事件捕獲。

你可以看到什麼領域都可以與一個事件:

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 

結果是:

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 

然而,在SQL 2012本次活動是由lock_timeout_greater_than_0具有取代(http://msdn.microsoft.com/en-us/library/ms144262.aspx)以下一組字段

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 

從這我abl e從它們的Id派生數據庫(database_id)和我的案例表(不同地在object_id,associated_object_id,resource_0中)。

我沒有看到一個明顯的方法來查找誰鎖定了此事件捕獲的數據中的對象。

編輯 - 有關使用sp_lock和sp_who2調試鎖定超時事件的原因的示例,請參見SQL Server Lock Timeout Exceeded Deleting Records in a Loop

+0

+1謝謝你的信息有關SQL Server 2012的改變不幸的是,我需要SQL Server 2008上這一信息也許,別人會發現SQL Server 2008年 –

+0

的解決方法你爲什麼設置了鎖定超時,通常如果沒有死鎖,它會等待無限的時間? – bkr

+0

該應用程序有一個用戶界面。 –

相關問題