web-dev-qa-db-ja.com

SQL Server 2008 R2でこれらのトランザクションDMVに違いがあるのはなぜですか?

以下の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;

12 の両方のBOLを読みましたが、違いが発生する理由についての明確な説明はありません。

異なる結果が得られます。前者のクエリは結果を返しませんが、後者はセッションIDとトランザクションIDを持つアクティブなトランザクションを返します。 request_idは0です。これは、セッションによって行われた唯一の要求であることを意味します。上記の2つの概念になぜ違いがあるのか​​、誰かが私に理解を助けてくれませんか?

[〜#〜]編集[〜#〜]

クエリを再実行したところ、session_id 2番目の結果セットには実際には含まれていません。

7
swasheck

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であらゆる種類の奇妙な小さな動作を発見しました。目的に合っている場合は、独自の監視クエリを作成するのではなく、それを使用できます。

6
Paul White 9

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 を参照してください。

4
Kin Shah

両方のDMVは、実行された正確な瞬間に起こっていることのスナップショットです。したがって 非常に おそらく実行中のビジーなシステムで

SELECT 
session_id, transaction_id
FROM sys.dm_tran_session_transactions;

SELECT 
session_id, transaction_id
FROM sys.dm_tran_session_transactions;

異なる結果セットを表示する可能性があります。

2
Max Vernon