2012-06-20 8 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を使用してデータベース(database_id)と私のケーステーブル(object_id、associated_object_id、resource_0のいろいろなもの)をIDから派生させます。

私は、このイベントでキャプチャされたデータからオブジェクトをロックしていた人物を見つけるための明白な方法はありませんでした。

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

アプリケーションにはユーザーインターフェイスがあります。 –

関連する問題