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.
Vedere anche