Ottieni transazioni fallite o mai impegnate


Risposte:


5

No, SQL Server non mantiene alcuna cronologia delle transazioni interrotte / ripristinate che è banale da raggiungere e non introduce ulteriori potenziali problemi (come indicato nella risposta di @ ooutwire ). O anche le transazioni che sono state impegnate.

Dovrai eseguire la tua registrazione all'interno della gestione degli errori o acquisire eventi specifici relativi alla transazione utilizzando la traccia lato server o Eventi estesi.

Tracciare:

inserisci qui la descrizione dell'immagine

Eventi estesi:

inserisci qui la descrizione dell'immagine


Sicuro, si trovano nel file di registro e nei file di backup del registro.
Outwire

1
@ooutwire e come si arriva facilmente a quelli? E come si arriva a loro se non sono più nel registro? Tali registri sono nella migliore delle ipotesi transitori.
Aaron Bertrand

Vedi la mia risposta Il modo migliore è creare backup di log frequenti. Concordo sul fatto che tale soluzione non sia l'ideale; ma non vedo alcun motivo per cui dovrei cercare continuamente prodotti sospesi. Se questo è il desiderio, allora una traccia o XEvent sembrerebbe la soluzione prudente.
ooutwire

2
Ho visto la tua risposta, ovviamente. Ho detto facilmente e avrei dovuto dirlo in modo affidabile . :-)
Aaron Bertrand

6
Sono con @AaronBertrand su questo. Con il problema che ci vorrà per sfogliare i registri delle transazioni ( Nota: non quello per cui sono destinati ) potresti anche creare una sessione XE leggera per questa risoluzione dei problemi.
Thomas Stringer,

4

Quando dici transazioni "fallite", cosa intendi esattamente?

Se si desidera visualizzare le transazioni correnti sull'istanza, è possibile utilizzare il sys.dm_tran_active_transactionsDMV.

Inoltre, sys.dm_exec_sessionsha open_transaction_countciò che può darti queste informazioni per sessione. Di seguito è una query diagnostica per estrarre tutti i processi utente che hanno transazioni aperte:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;

Queste informazioni possono anche essere estratte da sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Se si desidera acquisire quando sono state ripristinate le transazioni (presupponendo così tanto dal desiderio di transazioni "non riuscite"), è possibile acquisire l' rollback_tran_completedevento Eventi estesi . Se stai cercando una vista "tutto" delle transazioni, puoi catturare l' sql_transactionevento, come definito da SQL Server

Si verifica quando una transazione di SQL Server inizia, completa, ripristina o esegue un punto di salvataggio. Utilizzare questo evento per monitorare il comportamento delle transazioni durante la risoluzione dei problemi di applicazioni, trigger o procedure memorizzate.


4

È possibile utilizzare fn_dblog () e trovare gli ID transazione per le transazioni interrotte e una serie di altre informazioni utili.

SELEZIONARE * 
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
PARTIRE

Esegue la scansione di tutto il registro delle transazioni nella parte attiva del registro. Questo può essere superato usando il flag di traccia 2537, che ti permetterà di tornare il più lontano possibile all'inizio del più vecchio VLF "non riutilizzato". Prestare attenzione quando si utilizza questa funzione, poiché esegue la scansione del registro in modo casuale e il registro non può cambiare durante l'esecuzione della scansione; quindi, potresti vedere una crescita del registro.

È inoltre possibile utilizzare fn_dump_dblog su un file di backup del registro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.