【问题标题】:How to get owner and locked object from locks_lock_timeouts_greater_than_0 event in SQL Server?如何从 SQL Server 中的 locks_lock_timeouts_greater_than_0 事件中获取所有者和锁定对象?
【发布时间】:2012-06-22 17:46:29
【问题描述】:

我正在使用 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)

我怎样才能确定哪个对象被锁定以及当前谁在锁定它?

更新:我需要这个用于 SQL Server 2008。如何调试 2012 之前版本的锁定超时?

【问题讨论】:

    标签: sql-server sql-server-2008 tsql locking extended-events


    【解决方案1】:

    您想要的信息似乎没有被此事件捕获。

    您可以通过以下方式查看可用于事件的字段:

    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 中,此事件 (http://msdn.microsoft.com/en-us/library/ms144262.aspx) 被 lock_timeout_greater_than_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
    

    由此,我能够从它们的 Id 派生数据库 (database_id) 和在我的案例中的表(在 object_id、related_object_id、resource_0 中不同)。

    我没有看到一个明显的方法来从这个事件捕获的数据中找到谁在锁定对象。

    编辑 - 有关使用 sp_lock 和 sp_who2 调试锁定超时事件原因的示例,请参阅 SQL Server Lock Timeout Exceeded Deleting Records in a Loop

    【讨论】:

    • +1 感谢您提供有关 SQL Server 2012 更改的信息。不幸的是,我需要有关 SQL Server 2008 的信息。也许其他人会找到 SQL Server 2008 的解决方法。
    • 为什么要设置锁超时,正常情况下如果没有死锁就会无限等待?
    • 应用程序有一个用户界面。
    • 好吧,那么我建议您从您的应用程序中捕获错误并捕获诸如 sp_lock 和 sp_who2 之类的信息,以查看在故障点有什么锁。请参阅我上面帖子末尾的链接。您将锁定超时设置为多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多