Sql server 如何从SQL Server中的锁定\u锁定\u超时\u大于\u 0事件中获取所有者和锁定对象?
我正在使用SQL Server中的扩展事件捕获Sql server 如何从SQL Server中的锁定\u锁定\u超时\u大于\u 0事件中获取所有者和锁定对象?,sql-server,sql-server-2008,tsql,locking,extended-events,Sql Server,Sql Server 2008,Tsql,Locking,Extended Events,我正在使用SQL Server中的扩展事件捕获锁定\u锁定\u超时\u大于\u 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_b
锁定\u锁定\u超时\u大于\u 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)
如何确定锁定的对象以及当前锁定对象的人
更新:我需要这个用于SQL Server 2008。如何调试2012年以前版本的锁定超时?此事件似乎未捕获您想要的信息 您可以通过以下内容查看事件的可用字段:
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_大于_0,它具有以下字段集
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
从这一点,我能够从数据库(database_id)和案例表(object_id、关联的_object_id、resource_0)的id中派生出数据库(database_id)
我没有找到一个明显的方法来从这个事件捕获的数据中找到谁在锁定对象
编辑-有关使用sp_lock和sp_who2调试锁定超时事件原因的示例,请参阅。+1感谢您提供有关SQL Server 2012中更改的信息。不幸的是,我需要有关SQLServer2008的这些信息。也许,其他人会找到SQL Server 2008的解决方法。为什么设置锁定超时,如果没有死锁,通常会等待无限长的时间?应用程序有一个用户界面。嗯,然后,我建议您从应用程序捕获错误,并从sp_lock和sp_who2中捕获信息,以查看在故障点有哪些锁。请参阅我上面文章末尾的链接。您将锁定超时设置为什么?