適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft 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によって修正された行の以前のコミットバージョンを読み取っていました。