SQL Server sys.dm_tran_active_transactions 長時間執行的事務工作表
今天我使用了系統對象 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;
這也與指示 tempdb 在實例啟動期間被清除和啟動的日誌消息非常吻合:
我無法通過 DMV 找到任何方法將這些“事務”連結到特定會話,但我認為可以肯定地說它們是一個系統程序,無需擔心。
由於您提到您沒有在 中看到這些
sp_WhoIsActive
,因此值得指出的是,系統會話預設情況下已從該過程輸出中過濾掉。您可以通過傳遞一個額外的參數來查看它們:EXEC sp_WhoIsActive @show_system_spids = 1;