Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Qu'advient-il d'une transaction non validée lorsque la connexion est fermée ?

Il peut rester ouvert pendant que le regroupement de connexions s'applique. Exemple :le délai d'expiration de la commande peut laisser des verrous et TXN car le client envoie comme "abandon".

2 solutions :

  • Testez dans le client, littéralement :

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Utilisez SET XACT_ABORT ON pour s'assurer qu'un TXN est nettoyé :Question 1 et Question 2

J'utilise toujours SET XACT_ABORT ON .

À partir de ce blog de l'équipe SQL :

Notez qu'avec le regroupement de connexions, la simple fermeture de la connexion sans annulation ne renverra que la connexion au pool et la transaction restera ouverte jusqu'à ce qu'elle soit réutilisée ou supprimée ultérieurement du pool.

Depuis MSDN, section "Transaction Support" (mon gras)

Lorsqu'une connexion est fermée, elle est renvoyée dans le pool et dans la subdivision appropriée en fonction de son contexte de transaction. Par conséquent, vous pouvez fermer la connexion sans générer d'erreur, même si une transaction distribuée est toujours en attente. Cela vous permet de valider ou d'abandonner la transaction distribuée ultérieurement.