Obtenez des transactions qui ont échoué ou n'ont jamais été validées

Réponses:

5

Non, SQL Server ne conserve aucun historique sur les transactions qui ont été abandonnées / annulées, ce qui est trivial à atteindre et n'introduit pas de problèmes potentiels supplémentaires (comme indiqué dans la réponse de @ ooutwire ). Ou même des transactions qui ont été engagées.

Vous devrez effectuer votre propre journalisation dans le cadre de la gestion des erreurs ou capturer des événements spécifiques liés aux transactions à l'aide de la trace côté serveur ou des événements étendus.

Trace:

entrez la description de l'image ici

Événements prolongés:

entrez la description de l'image ici

Aaron Bertrand
la source
Bien sûr, ils se trouvent dans le fichier journal et les fichiers de sauvegarde du journal.
ooutwire
1
@ooutwire et comment y accéder facilement? Et comment pouvez-vous les atteindre s'ils ne sont plus dans le journal? Ces enregistrements de journal sont transitoires au mieux.
Aaron Bertrand
Voir ma réponse. La meilleure façon est de créer des sauvegardes de journaux fréquentes. Je conviens qu'une telle solution n'est pas idéale; mais je ne vois aucune raison pour laquelle je chercherais tout le temps à produire des transactions avortées. Si tel est le désir, alors une trace ou XEvent semblerait la solution prudente.
ooutwire
2
J'ai vu votre réponse, bien sûr. J'ai dit facilement et j'aurais aussi dû dire de manière fiable . :-)
Aaron Bertrand
6
Je suis avec @AaronBertrand sur celui-ci. Avec la difficulté qu'il faudra pour parcourir les journaux de transactions ( Remarque: pas à quoi ils sont destinés ), vous pourriez tout aussi bien créer une session XE légère pour ce dépannage.
Thomas Stringer
4

Lorsque vous dites des transactions «échouées», que voulez-vous dire exactement?

Si vous souhaitez voir les transactions en cours sur l'instance, vous pouvez utiliser le sys.dm_tran_active_transactionsDMV.

Aussi, sys.dm_exec_sessionsa le open_transaction_countqui peut vous donner ces informations par session. Voici une requête de diagnostic pour extraire tous les processus utilisateur qui ont des transactions ouvertes:

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;

Ces informations peuvent également être extraites de sys.dm_tran_session_transactions:

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;

Si vous souhaitez capturer lorsque les transactions ont été annulées (en supposant que votre désir de transactions "ait échoué"), vous pouvez capturer l' rollback_tran_completedévénement Événements étendus . Si vous recherchez une vue «tout» des transactions, vous pouvez capturer l' sql_transactionévénement qui, tel que défini par SQL Server, est

Se produit lorsqu'une transaction SQL Server commence, se termine, annule ou exécute un point de sauvegarde. Utilisez cet événement pour surveiller le comportement des transactions lors du dépannage des applications, des déclencheurs ou des procédures stockées.

Thomas Stringer
la source
4

Vous pouvez utiliser fn_dblog () et trouver les ID de transaction pour les transactions abandonnées ainsi qu'une foule d'autres informations utiles.

SELECT * 
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
ALLER

Il analyse tous les journaux de transactions dans la partie active du journal. Cela peut être remplacé à l'aide de l'indicateur de trace 2537, qui vous permettra de remonter le plus loin possible au début du plus ancien VLF "non réutilisé". Soyez prudent lorsque vous utilisez cette fonction, car elle analyse le journal de façon aléatoire et le journal ne peut pas changer lorsque l'analyse se produit; ainsi, vous pouvez voir une croissance du journal.

Vous pouvez également utiliser fn_dump_dblog sur un fichier de sauvegarde de journal.

sans fil
la source