今天我使用了系统对象 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) 中,正如人们对工作表所期望的那样:这也与指示 tempdb 在实例启动期间被清除和启动的日志消息非常吻合:
我无法通过 DMV 找到任何方法将这些“事务”链接到特定会话,但我认为可以肯定地说它们是一个系统进程,无需担心。
由于您提到您没有在 中看到这些
sp_WhoIsActive
,因此值得指出的是,系统会话默认情况下已从该过程输出中过滤掉。您可以通过传递一个额外的参数来查看它们: