Bra*_*rad 16 sql-server-2008 transaction troubleshooting
我真的很难追踪我们遇到的一些阻塞。
根阻塞的SPID的状态是“睡觉”,在CMD为“命令等待”,而sqltext为SET 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)
| 归档时间: |
|
| 查看次数: |
35757 次 |
| 最近记录: |