sys.dm_tran_active_snapshot_database_transactions (Transact-SQL)

En una instancia de SQL Server, esta vista de administración dinámica devuelve una tabla virtual de todas las transacciones activas que generan versiones de fila o que pueden tener acceso a ellas. Las transacciones se incluyen en función de una o varias de las siguientes condiciones:

  • Si una de las opciones de base de datos ALLOW_SNAPSHOT_ISOLATION y READ_COMMITTED_SNAPSHOT (o ambas) está establecida en ON:

    • Existe una fila para cada transacción que se ejecute en el nivel de aislamiento de instantáneas, o bien en el nivel de aislamiento de lectura confirmada que utiliza el control de versiones de fila.

    • Existe una fila para cada transacción que provoca la creación de una versión de fila en la base de datos actual. Por ejemplo, la transacción genera una versión de fila cuando actualiza o elimina una fila de la base de datos actual.

  • Cuando se inicia un desencadenador, existe una fila para la transacción en la que se ejecuta el desencadenador.

  • Cuando se ejecuta un procedimiento de indización en línea, existe una fila para la transacción que crea el índice.

  • Cuando se habilita la sesión MARS (Conjuntos de resultados activos múltiples), existe una fila para cada transacción que tiene acceso a las versiones de fila.

Esta vista de administración dinámica no incluye transacciones del sistema.

Sintaxis

sys.dm_tran_active_snapshot_database_transactions

Tabla devuelta

Nombre de columna

Tipo de datos

Descripción

transaction_id

bigint

Número de identificación único asignado para la transacción. El Id. de transacción se utiliza principalmente para identificar la transacción en las operaciones de bloqueo.

transaction_sequence_num

bigint

Número de secuencia de la transacción. Se trata de un número de secuencia único que se asigna a una transacción cuando se inicia. Las transacciones que no generan registros de versiones y no utilizan recorridos de instantáneas no reciben un número de secuencia de la transacción. Para obtener más información, vea Descripción de los niveles de aislamiento basado en el control de versiones de filas.

commit_sequence_num

bigint

Número de secuencia que indica cuándo finaliza (se confirma o se detiene) la transacción. Para las transacciones activas, el valor es NULL.

is_snapshot

int

0 = No es una transacción de aislamiento de instantánea.

1 = Es una transacción de aislamiento de instantánea.

session_id

int

Id. de la sesión que ha iniciado la transacción.

first_snapshot_sequence_num

bigint

Número más bajo de secuencia de la transacción de las transacciones que estaban activas cuando se obtuvo la instantánea. Cuando se ejecuta, una transacción de instantánea realiza una instantánea de todas las transacciones activas en ese momento. En las transacciones que no son de instantánea, en esta columna se muestra 0.

max_version_chain_traversed

int

Longitud máxima de la cadena de versiones que se recorre para buscar la versión coherente desde el punto de vista de las transacciones.

average_version_chain_traversed

real

Promedio de versiones de fila en las cadenas de versiones que se recorren.

elapsed_time_seconds

bigint

Tiempo transcurrido desde que la transacción obtuvo su número de secuencia de la transacción.

Permisos

Requiere el permiso VIEW SERVER STATE en el servidor.

Comentarios

sys.dm_tran_active_snapshot_database_transactions muestra transacciones que tienen asignado un número de secuencia de la transacción (XSN). Este XSN se asigna cuando la transacción tiene acceso por primera vez al almacén de versiones. En una base de datos habilitada para el aislamiento de instantáneas o el aislamiento de lectura confirmada que utiliza el control de versiones de fila, los ejemplos muestran cuándo se asigna un valor XSN a una transacción:

  • Si una transacción se ejecuta con el nivel de aislamiento serializable, se asigna un XSN cuando la transacción ejecuta por primera vez una instrucción, como una operación UPDATE, que provoca la creación de una versión de fila.

  • Si una transacción se ejecuta con el aislamiento de instantáneas, se asigna un XSN cuando se ejecuta cualquier instrucción de lenguaje de manipulación de datos (DML), incluida una operación SELECT.

Los números de secuencia de la transacción se incrementan en serie para cada transacción que se inicia en una instancia de Motor de base de datos.

Para obtener más información acerca de los números de secuencia de la transacción, vea Descripción de los niveles de aislamiento basado en el control de versiones de filas.

Ejemplos

En el ejemplo siguiente se utiliza un escenario de prueba con cuatro transacciones simultáneas, identificadas con un número de secuencia de transacción (XSN), que se ejecutan en una base de datos con las opciones ALLOW_SNAPSHOT_ISOLATION y READ_COMMITTED_SNAPSHOT establecidas en ON. Se están ejecutando las siguientes transacciones:

  • XSN-57 es una operación de actualización con aislamiento serializable.

  • XSN-58 es igual que XSN-57.

  • XSN-59 es una operación de selección con aislamiento de instantáneas.

  • XSN-60 es igual que XSN-59.

Se ejecuta la siguiente consulta.

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;

El conjunto de resultados es el siguiente.

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

La siguiente información evalúa los resultados de sys.dm_tran_active_snapshot_database_transactions:

  • XSN-57: dado que esta transacción no se ejecuta con aislamiento de instantáneas, los valores de is_snapshot y first_snapshot_sequence_num son 0. transaction_sequence_num muestra que se ha asignado un número de secuencia de la transacción a esta transacción, ya que una o ambas de las opciones de base de datos ALLOW_SNAPSHOT_ISOLATION o READ_COMMITTED_SNAPSHOT están establecidas en ON.

  • XSN-58: esta transacción no se ejecuta con aislamiento de instantáneas y se aplica la misma información que en XSN-57.

  • XSN-59: ésta es la primera transacción activa que se ejecuta con aislamiento de instantáneas. Esta transacción lee datos confirmados antes de XSN-57, como se indica mediante first_snapshot_sequence_num. La salida de esta transacción también muestra que la cadena de versiones máxima que se recorre para una fila es 1 y que ha recorrido un promedio de 1 versión para cada fila a la que se tiene acceso. Esto significa que las transacciones XSN-57, XSN-58 y XSN-60 no han modificado filas ni realizado confirmaciones.

  • XSN-60: ésta es la segunda transacción que se ejecuta con aislamiento de instantáneas. La salida muestra la misma información que XSN-59.