sys.dm_tran_active_snapshot_database_transactions (Transact-SQL)

この動的管理ビューは、SQL Server インスタンスにおいて、行バージョンを生成するか行バージョンにアクセスする可能性のあるすべてのアクティブなトランザクションに対し、仮想テーブルを返します。トランザクションは、次の条件を 1 つ以上満たします。

  • ALLOW_SNAPSHOT_ISOLATION データベース オプションと READ_COMMITTED_SNAPSHOT データベース オプションのいずれかまたは両方が ON に設定されている場合、

    • 行バージョン管理を使用するスナップショット分離レベルまたは READ COMMITTED 分離レベルで実行されているトランザクションごとに、1 行のデータが存在する。

    • 現在のデータベースに行バージョンを作成するトランザクションごとに、1 行のデータが存在する。たとえば、現在のデータベース内の行を更新または削除することによって行バージョンを生成するトランザクションがこれに該当します。

  • トリガが起動される場合、トリガが実行されるトランザクションごとに 1 行のデータが存在する。

  • オンライン インデックス処理中に、インデックスを作成しているトランザクションごとに 1 行のデータが存在する。

  • 複数のアクティブな結果セット (MARS) セッションが有効な場合、行バージョンにアクセスしているトランザクションごとに 1 行のデータが存在する。

この動的管理ビューにシステム トランザクションは含まれません。

構文

sys.dm_tran_active_snapshot_database_transactions

返されるテーブル

列名

データ型

説明

transaction_id

bigint

トランザクションに割り当てられている一意な識別番号。トランザクション ID は、主にロック操作でトランザクションを識別するときに使用します。

transaction_sequence_num

bigint

トランザクション シーケンス番号。トランザクションの開始時に割り当てられた一意なシーケンス番号です。バージョン レコードを生成せず、スナップショット スキャンを行わないトランザクションには、トランザクション シーケンス番号は割り当てられません。詳細については、「行のバージョン管理に基づく分離レベルについて」を参照してください。

commit_sequence_num

bigint

トランザクションが完了 (コミットまたは停止) したことを示すシーケンス番号。アクティブなトランザクションの場合、値は NULL になります。

is_snapshot

int

0 = スナップショット分離トランザクションではありません。

1 = スナップショット分離トランザクションです。

session_id

int

トランザクションを開始したセッションの ID。

first_snapshot_sequence_num

bigint

スナップショットが取得されたときにアクティブになっていたトランザクションの、最小トランザクション シーケンス番号。スナップショット トランザクションの実行時には、その時点でアクティブなすべてのトランザクションのスナップショットが取得されます。スナップショット以外のトランザクションの場合、この列は 0 になります。

max_version_chain_traversed

int

トランザクション全体で一貫性のあるバージョンを検索するためにスキャンされるバージョン チェーンの最大長。

average_version_chain_traversed

real

スキャンされるバージョン チェーン内の行バージョンの平均数。

elapsed_time_seconds

bigint

トランザクションがトランザクション シーケンス番号を取得してからの経過時間。

権限

サーバーに対する VIEW SERVER STATE 権限が必要です。

説明

sys.dm_tran_active_snapshot_database_transactions は、トランザクション シーケンス番号 (XSN) が割り当てられているトランザクションを返します。XSN は、トランザクションが最初にバージョン ストアにアクセスしたときに割り当てられます。行バージョン管理を使用するスナップショット分離または READ COMMITTED 分離が有効なデータベースにおいて、XSN がトランザクションに割り当てられるときの例を次に示します。

  • トランザクションが SERIALIZABLE 分離レベルで実行されている場合は、トランザクションで UPDATE 操作などのステートメントが最初に実行されるときに XSN が割り当てられ、これによって行バージョンが作成されます。

  • トランザクションがスナップショット分離で実行されている場合は、SELECT 操作などの任意の DML (データ操作言語) ステートメントが実行されるときに XSN が割り当てられます。

トランザクション シーケンス番号は、データベース エンジン インスタンスでトランザクションが開始されるたびに増分されます。

トランザクション シーケンス番号の詳細については、「行のバージョン管理に基づく分離レベルについて」を参照してください。

次の例では、4 つの同時実行トランザクションが存在するテスト シナリオを使用します。これらのトランザクションはそれぞれトランザクション シーケンス番号 (XSN) で識別され、ALLOW_SNAPSHOT_ISOLATION オプションと READ_COMMITTED_SNAPSHOT オプションが ON に設定されているデータベース内で実行されます。実行されるトランザクションは次のとおりです。

  • XSN-57。SERIALIZABLE 分離での更新操作です。

  • XSN-58。XSN-57 と同じです。

  • XSN-59。スナップショット分離での選択操作です。

  • XSN-60。XSN-59 と同じです。

次のクエリを実行します。

SELECT 
    transaction_id,
    transaction_sequence_num,
    commit_sequence_num,
    is_snapshot session_id,
    first_snapshot_sequence_num,
    max_version_chain_traversed,
    average_version_chain_traversed,
    elapsed_time_seconds
  FROM sys.dm_tran_active_snapshot_database_transactions;

以下に結果セットを示します。

transaction_id  transaction_sequence_num  commit_sequence_num
--------------  ------------------------  -------------------
9295            57                        NULL
9324            58                        NULL
9387            59                        NULL
9400            60                        NULL

is_snapshot  session_id   first_snapshot_sequence_num
-----------  -----------  ---------------------------
0            54           0
0            53           0
1            52           57
1            51           57

max_version_chain_traversed  average_version_chain_traversed
---------------------------  -------------------------------
0                            0
0                            0
1                            1
1                            1

elapsed_time_seconds
--------------------
419
397
359
333

sys.dm_tran_active_snapshot_database_transactions からの結果は、次のように評価されます。

  • XSN-57: このトランザクションはスナップショット分離で実行されていないので、is_snapshot の値と first_snapshot_sequence_num は 0 です。ALLOW_SNAPSHOT_ISOLATION データベース オプションまたは READ_COMMITTED_SNAPSHOT データベース オプションのいずれかあるいは両方が ON に設定されているので、transaction_sequence_num では、このトランザクションにトランザクション シーケンス番号が割り当てられていることが示されます。

  • XSN-58: このトランザクションはスナップショット分離で実行されていないので、XSN-57 と同じ説明が当てはまります。

  • XSN-59: これは、スナップショット分離で実行されている最初のアクティブなトランザクションです。このトランザクションは、first_snapshot_sequence_num で示されるように、XSN-57 より前にコミットされたデータを読み取ります。このトランザクションの出力では、1 行にスキャンされるバージョン チェーンの最大長が 1 で、アクセスした行ごとに平均で 1 つのバージョンがスキャンされていることも示されています。これは、トランザクション XSN-57、XSN-58、および XSN-60 では行が変更されずコミットされていないことを表します。

  • XSN-60: これは、スナップショット分離で実行されている 2 番目のトランザクションです。出力では、XSN-59 と同じ情報が示されます。