以下の2つのクエリを実行すると、
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とトランザクションIDを持つアクティブなトランザクションを返します。 request_id
は0です。これは、セッションによって行われた唯一の要求であることを意味します。上記の2つの概念になぜ違いがあるのか、誰かが私に理解を助けてくれませんか?
[〜#〜]編集[〜#〜]
クエリを再実行したところ、session_id
2番目の結果セットには実際には含まれていません。
sys.dm_tran_session_transactions
には自動コミットトランザクションは含まれません。
-- No result
SELECT
session_id,
transaction_id
FROM sys.dm_tran_session_transactions;
明示的なトランザクションを使用すると、結果が返されます。
BEGIN TRANSACTION;
-- Row returned
SELECT
session_id,
transaction_id
FROM sys.dm_tran_session_transactions;
ROLLBACK TRANSACTION;
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
-は、SQLサーバーインスタンスで開始されたが完了していない、タイプなどの、各トランザクションのステータス、状態を示すトランザクション情報を格納するDMVです。また、分散トランザクションに関する情報も提供します。このDMVは、サーバーインスタンス上のすべてのデータベースの結果を提供し、現在アクティブなトランザクションのポイントインタイムスナップショットです。結果は、個々のトランザクションの状態が変化するため、クエリが実行されるたびに変化します。
列リストと各列の意味については、 sys.dm_tran_session_transactions および sys.dm_tran_active_transactions を参照してください。
両方のDMVは、実行された正確な瞬間に起こっていることのスナップショットです。したがって 非常に おそらく実行中のビジーなシステムで
SELECT
session_id, transaction_id
FROM sys.dm_tran_session_transactions;
SELECT
session_id, transaction_id
FROM sys.dm_tran_session_transactions;
異なる結果セットを表示する可能性があります。