休眠 SPID 阻塞其他事务

Bra*_*rad 16 sql-server-2008 transaction troubleshooting

我真的很难追踪我们遇到的一些阻塞。

根阻塞的SPID的状态是“睡觉”,在CMD为“命令等待”,而sqltextSET TRANSACTION ISOLATION LEVEL READ COMMITTED

当我查看 Top Transactions by Blocked Transactions Count 报告时,Blocking SQL Statement 是“--”。

我已经对 SQL 进行了跟踪,当阻塞发生时跟踪根阻塞 SPID,但它并没有真正引导我到任何地方。最后一个 trace 语句与sqltext上面的相同SET TRANSACTION ISOLATION LEVEL READ COMMITTED

我已经检查了我能找到的所有相关存储过程,以确保它们具有 TRY/CATCH BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN 语句(我们对所有内容都使用存储过程,因此没有运行独立的语句)。这个问题在过去 24 小时内才开始发生,没有人声称对系统进行了任何更改。

解决方案:我们很少使用的存储过程之一在插入时出错(列数不匹配),但我们仍然对到底发生了什么感到困惑。

查看所有跟踪信息时,有时会列出此存储过程的 EXEC 语句,但绝不会在阻塞 SPID 上发生 BLOCK 之前。似乎当它开始阻塞时,跟踪没有记录它的执行(或其中的任何语句)。然而,也有其他时候跟踪确实记录了它的执行并且没有发生阻塞。

存储过程错误报告来自一个用户,我能够在跟踪中找到多个 EXEC 语句并在 SSMS 中运行它们。当我运行它们时,我们没有发生任何阻塞或它们挂起的情况。它们按预期运行(catch 块在错误发生后触发并回滚事务)。解决修复存储过程后,我们没有再看到这个问题。

gbn*_*gbn 12

从评论中,我猜你有一个客户端命令超时,它中止了 SQL 查询。这不会回滚事务,因为连接池由于连接池而在 SQL Server 上保持打开状态。

因此,您需要使用 SET XACT_ABORT ON 或添加一些客户端回滚代码

有关所有血腥详细信息,请参阅SQL Server 事务超时


Seb*_*ine 10

使用 sys.dm_exec_connections 中的 most_recent_sql_handle 查看最后执行的语句。

SELECT  t.text,
        QUOTENAME(OBJECT_SCHEMA_NAME(t.objectid, t.dbid)) + '.'
        + QUOTENAME(OBJECT_NAME(t.objectid, t.dbid)) proc_name,
        c.connect_time,
        s.last_request_start_time,
        s.last_request_end_time,
        s.status
FROM    sys.dm_exec_connections c
JOIN    sys.dm_exec_sessions s
        ON c.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t
WHERE   c.session_id = 72;--your blocking spid
Run Code Online (Sandbox Code Playgroud)

还要检查该 spid 是否有打开的事务

SELECT  st.transaction_id,
        at.name,
        at.transaction_begin_time,
        at.transaction_state,
        at.transaction_status
FROM    sys.dm_tran_session_transactions st
JOIN    sys.dm_tran_active_transactions at
        ON st.transaction_id = at.transaction_id
WHERE   st.session_id = 72;--your blocking spid
Run Code Online (Sandbox Code Playgroud)