sys.dm_tran_active_snapshot_database_transactions (Transact-SQL)

Dans une instance SQL Server, cette vue de gestion dynamique retourne une table virtuelle pour toutes les transactions actives qui génèrent des versions de ligne ou qui sont susceptibles d'y accéder. Les transactions sont incluses lorsque l'une des conditions suivantes, au minimum, est remplie :

  • Lorsque au moins l'une des deux options de base de données ALLOW_SNAPSHOT_ISOLATION et READ_COMMITTED_SNAPSHOT est définie à ON :

    • Il existe une ligne pour chaque transaction exécutée avec le niveau d'isolement de capture instantanée ou le niveau d'isolement de lecture validée avec le versioning de ligne.

    • Il existe une ligne pour chaque transaction qui entraîne la création d'une version de ligne dans la base de données active. Par exemple, la transaction génère une version de ligne en mettant à jour ou en supprimant une ligne dans la base de données active.

  • Lorsqu'un déclencheur est activé, il existe une ligne pour la transaction sous laquelle le déclencheur est exécuté.

  • Lorsqu'une procédure d'indexation est en cours d'exécution, il existe une ligne pour la transaction qui crée l'index.

  • Lorsqu'une session MARS (Multiple Active Results Sets) est activée, il existe une ligne pour chaque transaction qui accède aux versions de ligne.

Cette vue de gestion dynamique n'inclut pas les transactions système.

Syntaxe

sys.dm_tran_active_snapshot_database_transactions

Table retournée

Nom de colonne

Type de données

Description

transaction_id

bigint

Numéro d'identification unique assigné pour la transaction. L'ID de transaction permet principalement d'identifier la transaction dans les opérations de verrouillage.

transaction_sequence_num

bigint

Numéro de séquence de la transaction. Il s'agit d'un numéro de séquence unique qui est attribué à une transaction lorsqu'elle démarre. Les transactions qui ne produisent pas d'enregistrements de version et n'utilisent pas d'analyses de capture instantanée ne recevront pas de numéro de séquence. Pour plus d'informations, consultez Présentation des niveaux d'isolement basés sur le versioning de ligne.

commit_sequence_num

bigint

Numéro de séquence qui indique quand la transaction se termine (validée ou arrêtée). Pour les transactions actives, la valeur est NULL.

is_snapshot

int

0 = n'est pas une transaction d'isolement de capture instantanée.

1 = est une transaction d'isolement de capture instantanée.

session_id

int

ID de la session qui a démarré la transaction.

first_snapshot_sequence_num

bigint

Le plus petit numéro de séquence des transactions qui étaient actives lors de la création d'une capture instantanée. Lors de l'exécution, une transaction de capture instantanée effectue une capture instantanée de toutes les transactions actives présentes. Pour les transactions non liées à des captures instantanées, la valeur 0 est affichée dans cette colonne.

max_version_chain_traversed

int

Longueur maximale de la chaîne de versions traversée pour trouver la version cohérente d'un point de vue transactionnel.

average_version_chain_traversed

real

Nombre moyen de versions de ligne dans les chaînes de versions traversées.

elapsed_time_seconds

bigint

Temps écoulé depuis que la transaction a obtenu son numéro de séquence.

Autorisations

Nécessite l'autorisation VIEW SERVER STATE sur le serveur.

Notes

sys.dm_tran_active_snapshot_database_transactions génère des informations sur les transactions auxquelles un numéro de séquence est attribué. Ce numéro de séquence est attribué lorsque la transaction accède pour la première fois à la banque des versions. Dans une base de données qui est activée pour l'isolement de capture instantanée ou l'isolement de lecture validée avec le versioning de ligne, les exemples indiquent à quel moment un numéro de séquence est attribué à une transaction :

  • Si une transaction est exécutée avec le niveau d'isolement sérialisable, un numéro de séquence est attribué lorsque la transaction exécute pour la première fois une instruction (par exemple, une opération UPDATE) qui entraîne la création d'une version de ligne.

  • Si une transaction est exécutée avec le niveau d'isolement de capture instantanée, un numéro de séquence est attribué lorsqu'une instruction DML (Data Manipulation Language), y compris une opération SELECT, est exécutée.

Les numéros de séquence des transactions augmentent d'une unité à chaque transaction démarrée dans une instance du Moteur de base de données.

Pour plus d'informations sur les numéros de séquence des transactions, consultez Présentation des niveaux d'isolement basés sur le versioning de ligne.

Exemple

L'exemple suivant illustre un scénario de test dans lequel quatre transactions simultanées, chacune étant identifiée par un numéro de séquence de transaction, sont exécutées dans une base de données où les options ALLOW_SNAPSHOT_ISOLATION et READ_COMMITTED_SNAPSHOT sont définies à ON. Les transactions suivantes sont exécutées :

  • XSN-57 est une opération Update exécutée avec le niveau d'isolement sérialisable.

  • XSN-58 est identique à XSN-57.

  • XSN-59 est une opération Select exécutée avec le niveau d'isolement de capture instantanée.

  • XSN-60 est identique à XSN-59.

La requête suivante est exécutée :

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;

Voici l'ensemble des résultats.

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

Les informations suivantes évaluent les résultats de sys.dm_tran_active_snapshot_database_transactions :

  • XSN-57 : Compte tenu que cette transaction n'est pas exécutée avec le niveau d'isolement de capture instantanée, les valeurs de is_snapshot et first_snapshot_sequence_num correspondent à 0. transaction_sequence_num indique qu'un numéro de séquence de transaction a été attribué à cette transaction, car au moins l'une des options de base de données ALLOW_SNAPSHOT_ISOLATION et READ_COMMITTED_SNAPSHOT est activée (ON).

  • XSN-58 : Cette transaction n'est pas exécutée avec le niveau d'isolement de capture instantanée, et les informations fournies pour XSN-57 s'appliquent.

  • XSN-59 : Il s'agit de la première transaction active exécutée avec le niveau d'isolement de capture instantanée. Cette transaction lit les données qui sont validées avant XSN-57, comme l'indique l'argument first_snapshot_sequence_num. Le résultat de cette transaction indique également que le nombre maximal de chaîne de versions traversées pour une ligne est 1, avec une moyenne de 1 version traversée pour chaque ligne utilisée. Ceci signifie que les transactions XSN-57, XSN-58 et XSN-60 n'ont pas modifié les lignes et les ont validées.

  • XSN-60 : Il s'agit de la seconde transaction exécutée avec le niveau d'isolement de capture instantanée. Le résultat affiche les mêmes informations que pour la transaction XSN-59.