적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric의 SQL 데이터베이스
이 동적 관리 뷰는 행 버전 관리에 등록된 트랜잭션에 대한 정보를 반환하고 트랜잭션 시퀀스 번호(XSN)를 할당합니다. 거래는 다음 조건 중 하나 이상에 따라 포함될 수 있습니다:
한쪽 또는 둘 다
ALLOW_SNAPSHOT_ISOLATION데이터베이스READ_COMMITTED_SNAPSHOT옵션이 다음과 같을ON때:스냅샷 격리를 통해 스냅샷을 설정하거나 행 버전 관리(row versioning)를 사용하여 커밋드 격리를 읽는 트랜잭션입니다.
예를 들어, 데이터베이스에서 행을 업데이트하거나 삭제하여 해당 옵션을 활성화하여 행 버전을 생성하는 트랜잭션입니다.
트리거를 위해 행 버전을 생성하거나 접근하는 트랜잭션입니다.
온라인 인덱스 작업 중 행 버전 관리(row versioning)를 사용하는 트랜잭션들.
다중 활성 결과 집합(MARS) 세션에서 행 버전 관리(row versioning)를 사용하는 트랜잭션입니다.
SQL Server 2019(15.x) 및 이후 버전에서는, 가속 데이터베이스 복구(ADR)가 활성화된 데이터베이스 내 데이터를 수정하는 트랜잭션이 있으며, 두 스냅샷 데이터베이스 옵션이 모두 해당
OFF되더라도
이 동적 관리 뷰에는 시스템 트랜잭션이 포함되지 않습니다. 완료된 트랜잭션은 동시 열거나 트랜잭션 정리 중에 잠시 나타날 수 있습니다.
메모
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 서비스 목표 및 탄력적 풀데이터베이스, 서버 관리자 계정, 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_ISOLATIONREAD_COMMITTED_SNAPSHOT 된 데이터베이스에서 예시는 다음과 같습니다:
직렬화 가능한 격리 하에서 실행되는 트랜잭션은 처음으로 행 버전을 생성할 때 XSN이 할당됩니다. 예를 들어 또는
DELETE연산을 통해UPDATE이루어집니다.스냅샷 격리에서 실행되는 트랜잭션은 데이터 접근을 위한 스냅샷을 처음 설정할 때 XSN이 할당됩니다. 예를 들어, 사용자 테이블을 읽는 a
SELECT를 통해 이루어집니다.BEGIN TRANSACTION단독으로는 XSN을 할당하지 않습니다.
XSN은 인스턴스 전체에 걸쳐 증가하는 카운터에서 할당됩니다. 동일한 카운터가 문장 수준 스냅샷에도 사용되므로 트랜잭션 XSN이 연속적일 필요는 없습니다.
Examples
다음 예시는 와 READ_COMMITTED_SNAPSHOT 를 로 설정ON한 ALLOW_SNAPSHOT_ISOLATION 데이터베이스 내 네 개의 동시 트랜잭션을 보여줍니다:
- 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_numNULL도 마찬가지입니다.XSN-59와 XSN-60은 .
is_snapshot = 1스first_snapshot_sequence_num57냅샷이 설정될 때 활성 거래로 기록된 가장 오래된 거래를 식별합니다.XSN-59와 XSN-60의 경우, 최대 및 평균 버전 체인 횡단 길이는 모두
1입니다. 기록된 각 이동은 한 행 버전의 이동을 방문했습니다. 평균은 최소 한 행 버전을 방문하는 이동 횟수에 대해 계산됩니다.XSN-59와 XSN-60은 XSN-57과 XSN-58이 수정한 이전 커밋 버전을 읽었는데, 이 두 스냅샷 모두 설정될 때 아직 커밋되지 않은 상태였습니다.