sys.dm_tran_active_snapshot_database_transactions(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft 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_num NULL도 마찬가지입니다.

  • XSN-59와 XSN-60은 .is_snapshot = 1 스 first_snapshot_sequence_num57 냅샷이 설정될 때 활성 거래로 기록된 가장 오래된 거래를 식별합니다.

  • XSN-59와 XSN-60의 경우, 최대 및 평균 버전 체인 횡단 길이는 모두 1입니다. 기록된 각 이동은 한 행 버전의 이동을 방문했습니다. 평균은 최소 한 행 버전을 방문하는 이동 횟수에 대해 계산됩니다.

  • XSN-59와 XSN-60은 XSN-57과 XSN-58이 수정한 이전 커밋 버전을 읽었는데, 이 두 스냅샷 모두 설정될 때 아직 커밋되지 않은 상태였습니다.