Sql-Server

SQL Server sys.dm_tran_active_transactions 長時間執行的事務工作表

  • August 12, 2019

今天我使用了系統對象 sys.dm_tran_active_transactions(老實說,這是第一次)。我遇到了分佈式事務(Microsoft DTC)的問題,並且在我對 sp_whoIsActive 輸出一無所知後去那裡探勘。這個問題已經解決,但現在我看到表中有相當舊的事務,類型為“工作表”。這是以下查詢的輸出

SELECT  *,
case transaction_type   
     when 1 then 'Read/Write'   
     when 2 then 'Read-Only'    
     when 3 then 'System'   
     when 4 then 'Distributed'  
     else 'Unknown - ' + convert(varchar(20), transaction_type)     
end as tranType,    
case transaction_state 
     when 0 then 'Uninitialized' 
     when 1 then 'Not Yet Started' 
     when 2 then 'Active' 
     when 3 then 'Ended (Read-Only)' 
     when 4 then 'Committing' 
     when 5 then 'Prepared' 
     when 6 then 'Committed' 
     when 7 then 'Rolling Back' 
     when 8 then 'Rolled Back' 
     else 'Unknown - ' + convert(varchar(20), transaction_state) 
end as tranState, 
case dtc_state 
     when 0 then NULL 
     when 1 then 'Active' 
     when 2 then 'Prepared' 
     when 3 then 'Committed' 
     when 4 then 'Aborted' 
     when 5 then 'Recovered' 
     else 'Unknown - ' + convert(varchar(20), dtc_state) 
end as dtcState
FROM    sys.dm_tran_active_transactions 
ORDER BY transaction_begin_time

在此處輸入圖像描述

transaction_begin_time 恰好與 SQL Server 服務上次重新啟動的時間相關。

我應該以任何方式擔心這個嗎?我確實查看了https://www.sqlservergeeks.com/sys-dm_tran_active_transactions/以了解有關 dmv 的更多資訊。但是它只是提到工作表用於在 tempdb 中儲存臨時查詢結果。但是我的理解是,如果我啟動一個執行計劃決定假離線到 tempdb 並使用工作表的查詢,則每次需要時都會創建一個新的工作表。因此,有 6 個這麼舊的工作台似乎很奇怪。我可以假設這些是自服務重新啟動以來重複使用的表,用於監視不斷執行的查詢或內部 SQL 伺服器的東西。無論如何,只讀事務類型似乎是無害的,我沒有註意到阻塞或版本儲存增長的跡象。

提前感謝你的幫助

馬丁

我在我的2016實例上看到了同樣的事情——正好 6 個工作表事務,這些事務在伺服器啟動後幾秒鐘就開始了。如果我加入sys.dm_tran_database_transactions,我可以看到這些事務存在於tempdb(database_id = 2) 中,正如人們對工作表所期望的那樣:

SELECT 
   dtat.transaction_id,
   dtat.[name],
   dtat.transaction_begin_time,
   dtdt.database_id
FROM sys.dm_tran_active_transactions dtat
   INNER JOIN sys.dm_tran_database_transactions dtdt
       ON dtat.transaction_id = dtdt.transaction_id;

顯示從 04:41:04 開始的工作表事務的查詢結果螢幕截圖

這也與指示 tempdb 在實例啟動期間被清除和啟動的日誌消息非常吻合:

顯示 tempdb 在 04:41:03 啟動的錯誤日誌消息的螢幕截圖

我無法通過 DMV 找到任何方法將這些“事務”連結到特定會話,但我認為可以肯定地說它們是一個系統程序,無需擔心。


由於您提到您沒有在 中看到這些sp_WhoIsActive,因此值得指出的是,系統會話預設情況下已從該過程輸出中過濾掉。您可以通過傳遞一個額外的參數來查看它們:

EXEC sp_WhoIsActive @show_system_spids = 1;

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