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와 같습니다.