Sql-Server-2008

休眠 SPID 阻塞其他事務

  • February 2, 2017

我真的很難追踪我們遇到的一些阻塞。

根阻止 SPID 的狀態是“睡眠”,cmd 是“等待命令”,並且sqltextSET 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

引用自:https://dba.stackexchange.com/questions/41709