sys.dm_tran_active_snapshot_database_transactions(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric SQL Database

この動的管理ビューは、行バージョン管理に登録されトランザクションシーケンス番号(XSN)が割り当てられたトランザクションの情報を返します。 取引は以下のいずれかの条件で含めることができます:

  • ALLOW_SNAPSHOT_ISOLATIONおよびREAD_COMMITTED_SNAPSHOTデータベースの選択肢のいずれかまたは両方がONされた場合:

    • スナップショット隔離のもとでスナップショットを確立するか、行のバージョン管理を用いてコミット済みのリード隔離を行うトランザクションです。

    • 例えば、これらのオプションを有効にしたデータベース内の行を更新または削除することで行のバージョンを生成するトランザクションです。

  • トリガー用の行バージョンを生成またはアクセスするトランザクション。

  • オンラインインデックス操作中に行バージョン管理を使用するトランザクション。

  • マルチアクティブ結果セット(MARS)セッションで行バージョン管理を使用するトランザクション。

  • 2019 SQL Server(15.x)以降のバージョンでは、両方のスナップショットデータベースオプションがOFFされていても、加速データベース復元(ADR)を有効にしたデータベース内のデータを変更するトランザクションが発生します。

この動的管理ビューにはシステムトランザクションは含まれていません。 完了したトランザクションは、同時列挙やトランザクションの整理中に一瞬だけ表示されることがあります。

Note

Azure Synapse Analyticsから呼ぶには、sys.dm_pdw_nodes_tran_active_snapshot_database_transactionsという名前を使います。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

Syntax

sys.dm_tran_active_snapshot_database_transactions  

返されるテーブル

列名 データの種類 Description
transaction_id bigint 取引に割り当てられた固有の識別番号。 トランザクション ID は、主にロック操作でトランザクションを識別するために使用されます。
transaction_sequence_num bigint トランザクションが最初に行のバージョン管理を必要とする際に割り当てられる一意のシーケンス番号。 行バージョンを生成せず、スナップショットスキャンも使わないトランザクションにはトランザクションシーケンス番号が割り当てられません。
commit_sequence_num bigint このビューでは常にNULLです。
session_id int トランザクションに関連付けられたセッションのID。
is_snapshot bit 0 = スナップショット分離トランザクションではありません。

1 = スナップショット分離トランザクションです。
first_snapshot_sequence_num bigint トランザクションが現在保持しているスナップショットでアクティブなと記録された最低トランザクションシーケンス番号。 トランザクションレベルおよびステートメントレベルのスナップショットを含みます。 NULLはそのようなシーケンス番号が記録されていない場合に表されます。
max_version_chain_traversed int トランザクションが単一のバージョンチェーンで通過する最大行数。 行バージョンを経由しなければ0を返します。
average_version_chain_traversed float トランザクションによるバージョンチェーントラバーサルあたりの平均行数。 長さ0のトラバーサルは除外します。 行バージョンを経由しなければ0を返します。
elapsed_time_seconds bigint トランザクションがトランザクションのシーケンス番号を取得してから、秒単位で経過した時間。
pdw_node_id int 適用対象:Azure Synapse Analytics

このディストリビューションがオンになっているノードの識別子。

Permissions

SQL Server と SQL Managed Instance では、VIEW SERVER STATE アクセス許可が必要です。

SQL Database の Basic、S0、S1 サービス対象、および Elastic Pool のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、または ##MS_ServerStateReader##サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する VIEW DATABASE STATE アクセス許可または ##MS_ServerStateReader## サーバー ロールのメンバーシップのいずれかが必要です。

SQL Server 2022 以降でのアクセス許可

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

注釈

sys.dm_tran_active_snapshot_database_transactions 行のバージョン管理のためにトランザクションシーケンス番号(XSN)が割り当てられたトランザクションを報告します。 XSNはトランザクションが最初に行バージョン管理を必要とする時に割り当てられ、必ずしも開始時やバージョンストアへの物理的アクセス時ではありません。

ALLOW_SNAPSHOT_ISOLATIONやREAD_COMMITTED_SNAPSHOTが有効なデータベースでは、例として以下が挙げられます:

  • シリアライズ可能な隔離下で動作するトランザクションは、 UPDATE や DELETE 操作などを通じて初めて行バージョンを生成する際にXSNが割り当てられます。

  • スナップショット隔離下で動作するトランザクションは、例えばユーザーテーブルを読み込む SELECT を通じて、データアクセス用のスナップショットを最初に確立する際にXSNが割り当てられます。 BEGIN TRANSACTION 単独ではXSNを割り当てることはありません。

XSNはインスタンス全体の増加カウンタから割り当てられます。 同じカウンターはステートメントレベルのスナップショットにも使われるため、トランザクションXSNは連続的である必要はありません。

Examples

以下の例は、 ALLOW_SNAPSHOT_ISOLATION と READ_COMMITTED_SNAPSHOT が ONに設定されたデータベース内の4つの同時取引を示しています。

  • XSN-57はシリアライズ可能な分離状態で UPDATE を実行し、コミットせずにいます。
  • XSN-58はシリアライズ可能な隔離状態で別の UPDATE を実行し、コミットせずにいます。
  • XSN-59はスナップショット隔離のもとで SELECT を実行し、開いたままです。
  • XSN-60はスナップショット隔離のもとで別の SELECT を実行し、開いたままです。

両方のスナップショットトランザクションは、XSN-57およびXSN-58がアクティブな間にそれぞれのスナップショットを確立します。 SELECT文は、コミットされていない更新によって修正された行の初期バージョンを読み取っています。

以下のクエリが実行されます:

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
ORDER BY transaction_sequence_num;

以下の出力は説明的なものです。 実際の識別子、シーケンス番号、統計、経過時間は様々です。

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
--------------  ------------------------  -------------------  -----------  ----------  ---------------------------  ---------------------------  -------------------------------  --------------------
9295            57                        NULL                 0            54          NULL                         0                            0                                419
9324            58                        NULL                 0            53          NULL                         0                            0                                397
9387            59                        NULL                 1            52          57                           1                            1                                359
9400            60                        NULL                 1            51          57                           1                            1                                333

結果は以下の通りです。

  • XSN-57とXSN-58はシリアライズ可能なアイソレーションを使用しているため、 is_snapshot = 0。 これらのトランザクション内で実行される UPDATE 文は、データベースのスナップショットオプションが ONされるため、行バージョンを生成します。 このバージョン生成によりトランザクションのシーケンス番号が割り当てられます。 この例ではどちらのトランザクションもスナップショットを保持していないため、 first_snapshot_sequence_num はNULLです。

  • XSN-59とXSN-60は is_snapshot = 1を持っています。 57のfirst_snapshot_sequence_num値は、スナップショットが確立された時点でアクティブとして記録された最も古い取引を特定します。

  • XSN-59およびXSN-60では、最大および平均バージョンチェーン走査長はどちらも 1です。 記録された各移動は1列のバージョンを訪れました。 平均は少なくとも1行のバージョンを訪問したトラバーサルで計算されます。

  • XSN-59とXSN-60は、両方のスナップショットが確立された時点でまだコミットされていなかったXSN-57およびXSN-58によって修正された行の以前のコミットバージョンを読み取っていました。