다음을 통해 공유


sys.dm_tran_active_snapshot_database_transactions(Transact-SQL)

SQL Server 인스턴스에서 이 동적 관리 뷰는 행 버전을 생성하거나 액세스할 수 있는 모든 활성 트랜잭션에 대한 가상 테이블을 반환합니다. 트랜잭션은 다음 중 하나 이상의 조건에서 포함됩니다.

  • ALLOW_SNAPSHOT_ISOLATION 및 READ_COMMITTED_SNAPSHOT 데이터베이스 옵션 중 하나 또는 둘 다가 ON으로 설정된 경우

    • 스냅숏 격리 수준이나 행 버전 관리를 사용하는 커밋된 읽기 격리 수준에서 실행되는 각 트랜잭션에 대해 하나의 행이 있습니다.

    • 현재 데이터베이스에서 행 버전이 생성되게 하는 각 트랜잭션에 대해 하나의 행이 있습니다. 예를 들어 트랜잭션은 현재 데이터베이스에서 행을 업데이트하거나 삭제하여 행 버전을 생성합니다.

  • 트리거가 발생하면 트리거를 실행하는 트랜잭션에 대해 하나의 행이 있습니다.

  • 온라인 인덱싱 프로시저가 실행되고 있으면 인덱스를 만드는 트랜잭션에 대해 하나의 행이 있습니다.

  • MARS(Multiple Active Results Sets) 세션을 설정하면 행 버전에 액세스하는 각 트랜잭션에 대해 하나의 행이 있습니다.

이 동적 관리 뷰에는 시스템 트랜잭션이 포함되지 않습니다.

구문

sys.dm_tran_active_snapshot_database_transactions

반환된 테이블

열 이름

데이터 형식

설명

transaction_id

bigint

트랜잭션에 할당된 고유 ID입니다. 트랜잭션 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이 할당됩니다. 스냅숏 격리나 행 버전 관리를 사용하는 커밋된 읽기 격리가 설정된 데이터베이스에서 이 예는 XSN이 트랜잭션에 할당된 시기를 보여 줍니다.

  • 트랜잭션이 직렬화 가능 격리 수준에서 실행되는 경우 트랜잭션에서 행 버전이 생성되게 하는 UPDATE 작업 등의 문을 처음으로 실행할 때 XSN이 할당됩니다.

  • 트랜잭션이 스냅숏 격리에서 실행되는 경우 SELECT 작업 등의 DML(데이터 조작 언어) 문을 실행할 때 XSN이 할당됩니다.

트랜잭션 시퀀스 번호는 데이터베이스 엔진 인스턴스에서 시작된 트랜잭션마다 순차적으로 증가합니다.

트랜잭션 시퀀스 번호에 대한 자세한 내용은 행 버전 관리 기반 격리 수준 이해를 참조하십시오.

다음 예에서는 ALLOW_SNAPSHOT_ISOLATION 및 READ_COMMITTED_SNAPSHOT 옵션이 ON으로 설정된 데이터베이스에서 각각 XSN(트랜잭션 시퀀스 번호)으로 식별되는 4개의 동시 트랜잭션이 실행되는 테스트 시나리오를 사용합니다. 다음 트랜잭션이 실행되고 있습니다.

  • XSN-57은 직렬화 격리에서 실행되는 UPDATE 작업입니다.

  • XSN-58은 XSN-57과 같습니다.

  • XSN-59는 스냅숏 격리에서 실행되는 SELECT 작업입니다.

  • 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 버전을 이동했음을 보여 줍니다. 이는 XSN-57, XSN-58 및 XSN-60 트랜잭션이 행을 수정하지 않고 커밋했음을 의미합니다.

  • XSN-60: 스냅숏 격리에서 실행되는 두 번째 트랜잭션입니다. 출력에 표시되는 정보는 XSN-59와 같습니다.