Sql-Server

什麼可能導致睡眠會話有一個打開的事務?

  • July 15, 2020

對於我們的一個 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 設置在這種情況下將如何幫助?

請指教

可以解釋這些症狀的情景包括:

  1. 應用程式碼已啟動事務但未送出
  2. 應用程序SET IMPLICIT_TRANSACTIONS ON
  3. 儲存過程包括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 碰巧引發錯誤並回滾錯誤的事務作為結果。

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