休眠 SPID 阻塞其他事務
我真的很難追踪我們遇到的一些阻塞。
根阻止 SPID 的狀態是“睡眠”,cmd 是“等待命令”,並且
sqltext
是SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.當我查看按阻塞事務計數排名靠前的事務報告時,阻塞 SQL 語句為“–”。
我已經對 SQL 進行了跟踪,並且當阻塞發生時跟踪根阻塞 SPID,但它並沒有真正引導我到任何地方。最後一個跟踪語句與
sqltext
上面相同SET TRANSACTION ISOLATION LEVEL READ COMMITTED
。我已經檢查了我能找到的所有相關儲存過程,以確保它們具有 TRY/CATCH BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN 語句(我們對所有內容都使用儲存過程,因此沒有執行獨立語句)。此問題在過去 24 小時內剛剛開始發生,沒有人聲稱對系統進行了任何更改。
解決方案:我們很少使用的一個儲存過程在插入時出錯(列數不匹配),但我們仍然對到底發生了什麼感到困惑。
查看所有跟踪資訊時,有時會列出此儲存過程的 EXEC 語句,但絕不會在阻塞 SPID 上發生 BLOCK 之前。似乎當它開始阻塞時,跟踪沒有記錄它的執行(或其中的任何語句)。然而,在其他時候,跟踪確實記錄了它的執行並且沒有發生阻塞。
儲存過程錯誤報告來自使用者,我能夠在跟踪中找到多個 EXEC 語句並在 SSMS 中執行它們。當我執行它們時,我們沒有發生任何阻塞或它們掛起。它們按預期執行(catch 塊在錯誤後觸發並回滾事務)。在解決了修復儲存過程之後,我們再也沒有看到這個問題。
從評論中,我猜你有一個客戶端命令超時,它已經中止了 SQL 查詢。這不會回滾事務,因為由於連接池,連接在 SQL Server 上保持打開狀態。
因此,您需要使用 SET XACT_ABORT ON 或添加一些客戶端回滾程式碼
有關所有血腥細節,請參閱SQL Server 事務超時
使用 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
還要檢查該 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