当我执行下面的两个查询时,
SELECT
session_id, transaction_id
FROM sys.dm_tran_session_transactions;
和
SELECT
session_id, request_id, at.transaction_id
FROM sys.dm_tran_active_transactions at
JOIN sys.dm_exec_requests r
ON r.transaction_id = at.transaction_id;
我已经阅读了1和2的 BOL,但没有看到任何关于为什么会出现差异的明确解释。
我得到不同的结果。前者查询不返回任何结果,但后者返回具有会话和事务 ID 的活动事务。是 0,我认为这request_id
意味着它是会话发出的唯一请求。有人可以帮助我理解为什么我上面查询的两个概念之间存在差异吗?
编辑
我只是重新运行查询,现在我得到了第一个 DMV 的结果,它session_id
实际上不包含在第二个结果集中。
似乎
sys.dm_tran_session_transactions
不包括自动提交事务:使用显式事务确实会返回结果:
DMV 是关于内部结构的视图,文档通常不像其他领域那样全面。其中一些可能是因为每次 DMV 行为发生变化时都要经历一个完整的弃用周期是不方便的,但在这种情况下它可能只是一个疏忽。您可以在 Connect 上报告文档缺陷。
Adam Machanic 在编写他的sp_WhoIsActive工具时发现了 DMV 的各种奇怪的小行为。如果它适合您的目的,您可以使用它而不是尝试编写您自己的监控查询。
sys.dm_tran_session_transactions
是一个中间视图,允许将主要标识在session_id column
-sys.dm_exec*
DMV 上的 DMV 与其他sys.dm_tran_*
DMV 连接起来。此视图将判断事务是用户事务is_user_transaction
= 1 还是系统事务is_user_transaction
= 0。另一方面,
sys.dm_tran_active_transactions
- 是将存储交易信息的 DMV,显示状态、每个交易的状态 - 已启动但未完成、类型等在 sql server 实例上。它还提供有关分布式事务的信息。此 DMV 将为服务器实例上的所有数据库提供结果,它是当前活动事务的时间点快照 - 每次执行查询时结果都会更改,因为单个事务的状态会更改。有关列列表和每列的含义,请参阅sys.dm_tran_session_transactions和sys.dm_tran_active_transactions。
两个 DMV 都是在执行它们的精确时刻发生的事情的快照。因此,
很可能在一个繁忙的系统上运行可以显示不同的结果集。