用于查找 SQL Server 中死锁的 T-SQL 查询

发布时间 2023-07-29 13:08:35作者: 雪竹子

用于查找 SQL Server 中死锁的 T-SQL 查询

早些时候,我写了一篇关于使用扩展事件来查找 SQL Server 上发生的死锁的文章。扩展事件对于跟踪服务器上短时间内发生的死锁有很大帮助,尤其是在生产环境中。然而,在开发环境中,我遇到过当多个开发人员尝试对表执行 dml 语句时出现持续长时间死锁的情况。在这种情况下,我使用轻量级 T-SQL 查询来查找死锁,即SQL 连接的阻塞和阻塞会话 ID根据该语句返回的详细信息,我能够找到执行阻塞会话的应用程序或用户,并帮助我终止特定的 SQL 连接。它还帮助我们识别并修复频繁阻塞的 SQL 语句。

下面是我用来快速查找死锁的查询。该语句基于SYS.DM_EXEC_REQUESTS动态管理视图。在此语句中,blocking_session_id列为您提供阻塞连接的 session_id,wait_type 列为您提供导致死锁的等待类型获取blocking_session_id后,您可以使用另一个dmv SYS.DM_EXEC_SESSIONS来获取有关会话或连接的更多详细信息。

SELECT
    session_id,
    start_time, 
    [status],
    command,
    blocking_session_id,
    wait_type,
    wait_time,
    open_transaction_count,
    transaction_id,
    total_elapsed_time,
    Definition = CAST(text AS VARCHAR(MAX))
FROM
    SYS.DM_EXEC_REQUESTS
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
WHERE blocking_session_id != 0

  

 

希望这个查找死锁的简单查询对大家有所帮助。

参考

  • 有关 sys.dm_exec_requests dmv 的更多信息,请访问Microsoft Docs

引用

https://www.mytecbits.com/microsoft/sql-server/t-sql-query-to-find-deadlocks