sys.dm_tran_active_snapshot_database_transactions (Transact-SQL)

In un'istanza di SQL Server questa vista a gestione dinamica restituisce una tabella virtuale per tutte le transazioni attive che generano versioni di riga o che potrebbero accedervi. Le transazioni vengono incluse in una o più delle situazioni seguenti:

  • Quando l'opzione di database ALLOW_SNAPSHOT_ISOLATION o READ_COMMITTED_SNAPSHOT oppure entrambe le opzioni sono impostate su ON:

    • È presente una riga per ogni transazione in esecuzione nel livello di isolamento dello snapshot o nel livello di isolamento Read-committed che utilizza il controllo delle versioni delle righe.

    • È presente una riga per ogni transazione che provoca la creazione di una versione di riga nel database corrente. Ad esempio, la transazione genera una versione di riga mediante l'aggiornamento o l'eliminazione di una riga nel database corrente.

  • Quando si attiva un trigger, è presente una riga per la transazione nel cui ambito il trigger viene eseguito.

  • Quando una procedura di indicizzazione in linea è in esecuzione, è presente una riga per la transazione che crea l'indice.

  • Quando è abilitata una sessione MARS (Multiple Active Results Sets), è presente una riga per ogni transazione che accede alle versioni di riga.

Questa vista a gestione dinamica non include transazioni di sistema.

Sintassi

sys.dm_tran_active_snapshot_database_transactions

Tabella restituita

Nome colonna

Tipo di dati

Descrizione

transaction_id

bigint

Numero di identificazione univoco assegnato alla transazione. L'ID transazione viene principalmente utilizzato per identificare la transazione nelle operazioni di blocco.

transaction_sequence_num

bigint

Numero di sequenza di una transazione, ovvero un numero di sequenza univoco assegnato a una transazione al momento dell'avvio. Alle transazioni che non generano record di versione o che non utilizzano scansioni di snapshot non verrà assegnato alcun numero di sequenza. Per ulteriori informazioni, vedere Informazioni sui livelli di isolamento basati sul controllo delle versioni delle righe.

commit_sequence_num

bigint

Numero di sequenza che indica quando la transazione termina (commit o interruzione). Per le transazioni attive il valore è NULL.

is_snapshot

int

0 = Non si tratta di una transazione di isolamento dello snapshot.

1 = Si tratta di una transazione di isolamento dello snapshot.

session_id

int

ID della sessione che ha avviato la transazione.

first_snapshot_sequence_num

bigint

Numero di sequenza più basso delle transazioni attive nel momento in cui è stato eseguito uno snapshot. Durante l'esecuzione, una transazione snapshot esegue uno snapshot di tutte le transazioni attive in quel momento. Per le transazioni non snapshot, nella colonna viene visualizzato 0.

max_version_chain_traversed

int

Lunghezza massima della catena delle versioni attraversata per trovare la versione consistente dal punto di vista transazionale.

average_version_chain_traversed

real

Numero medio di versioni di riga nelle catene delle versioni attraversate.

elapsed_time_seconds

bigint

Tempo trascorso dal momento in cui la transazione ha acquisito il relativo numero di sequenza.

Autorizzazioni

È richiesta l'autorizzazione VIEW SERVER STATE nel server.

Osservazioni

sys.dm_tran_active_snapshot_database_transactions restituisce le transazioni a cui è stato assegnato un numero di sequenza della transazione (XSN). Il numero XSN viene assegnato quando la transazione accede per la prima volta all'archivio delle versioni. Negli esempi viene illustrato cosa accade quando si assegna un numero XSN a una transazione in un database abilitato per l'isolamento dello snapshot o l'isolamento Read-committed che utilizza il controllo delle versioni delle righe:

  • Se una transazione viene eseguita nel livello di isolamento serializzabile, il numero XSN viene assegnato quando la transazione esegue per la prima volta un'istruzione, ad esempio un'operazione UPDATE, che provoca la creazione di una versione di riga.

  • Se una transazione viene eseguita nel livello di isolamento dello snapshot, il numero XSN viene assegnato al momento dell'esecuzione di una qualsiasi istruzione DML (Data Manipulation Language), inclusa un'operazione SELECT.

Per ogni transazione avviata in un'istanza del Motore di database il relativo numero di sequenza viene incrementato in modo seriale.

Per ulteriori informazioni sui numeri di sequenza delle transazioni, vedere Informazioni sui livelli di isolamento basati sul controllo delle versioni delle righe.

Esempi

Nell'esempio seguente viene utilizzato uno scenario di testing in cui quattro transazioni simultanee, ognuna identificata da un numero di sequenza della transazione (XSN), vengono eseguite in un database in cui le opzioni ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT sono impostate su ON. Sono in esecuzione le transazioni seguenti:

  • XSN-57 è un'operazione di aggiornamento nel livello di isolamento serializzabile.

  • XSN-58 è uguale a XSN-57.

  • XSN-59 è un'operazione di selezione nel livello di isolamento dello snapshot.

  • XSN-60 è uguale a XSN-59.

Viene eseguita la query seguente.

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;

Set di risultati:

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

Le informazioni seguenti valutano i risultati di sys.dm_tran_active_snapshot_database_transactions:

  • XSN-57: poiché questa transazione non viene eseguita nel livello di isolamento dello snapshot, is_snapshot e first_snapshot_sequence_num hanno valore 0. transaction_sequence_num indica che alla transazione è stato assegnato un numero di sequenza della transazione, poiché una o entrambe le opzioni di database ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT sono impostate su ON.

  • XSN-58: questa transazione non viene eseguita nel livello di isolamento dello snapshot e si applicano le stesse informazioni di XSN-57.

  • XSN-59: si tratta della prima transazione attiva in esecuzione nel livello di isolamento dello snapshot. Questa transazione legge i dati di cui è stato eseguito il commit prima di XSN-57, come indicato da first_snapshot_sequence_num. L'output di questa transazione mostra inoltre che la catena massima delle versioni attraversata per una riga è pari a 1 e che è stata attraversata in media 1 versione per ogni riga a cui è stato eseguito l'accesso. Ciò significa che le transazioni XSN-57, XSN-58 e XSN-60 non hanno modificato righe e non ne hanno eseguito il commit.

  • XSN-60: si tratta della seconda transazione eseguita nel livello di isolamento dello snapshot. L'output restituisce le stesse informazioni di XSN-59.