Sql-Server
什麼可能導致睡眠會話有一個打開的事務?
對於我們的一個 SQL 伺服器,有一個 proc 會造成阻塞:
該儲存過程在大多數情況下會在一秒鐘內完成,但不知何故使事務處於打開狀態。我從 sp_whoisactive 看到的是 status = sleep 並打開 tran 1 持續約 5-6 分鐘。在此期間,出現了起伏的阻塞鏈。
該 SP 沒有任何事務,如 BEGIN 和 END TRAN。它做了一些基本的 select col,col2,col3…. into #temptables from table1 inner join table 2 … 然後從中選擇 #temptable
當我們從應用程序檢查為什麼可能有一個事務處於打開狀態時,我正在閱讀在這種情況下以在 SP 本身中使用 XACT ABORT ON。但是當不涉及事務時,XACT ABORT 設置在這種情況下將如何幫助?
請指教
可以解釋這些症狀的情景包括:
- 應用程式碼已啟動事務但未送出
- 應用程序
SET IMPLICIT_TRANSACTIONS ON
- 儲存過程包括
SET IMPLICIT_TRANSACTIONS ON
此 DMV 查詢將有助於故障排除。如果隱式啟動,事務名稱值將是“implicit_transaction”。其他可能的值包括“user_transaction”、“DTC Transaction”或使用者指定的事務名稱。“user_transaction”值(沒有顯式 proc 事務)表示事務必須已在客戶端啟動且未送出。“DTC Transaction”的值表示分佈式事務,也表示應用端的事務管理存在問題。
SELECT session_tran.session_id , active_tran.name FROM sys.dm_tran_session_transactions AS session_tran INNER JOIN sys.dm_tran_active_transactions AS active_tran ON session_tran.transaction_id = active_tran.transaction_id;
SET XACT_ABORT ON
在儲存過程中包含顯式事務以確保事務回滾是一種很好的做法,尤其是在客戶端超時之後。這可能在這裡無濟於事,因為您的 proc 沒有顯式事務,除非 proc 碰巧引發錯誤並回滾錯誤的事務作為結果。