web-dev-qa-db-fra.com

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

Sont-ils annulés immédiatement? Sont-ils annulés après un certain temps? Sont-ils laissés dans un état non engagé?

Le comportement est-il le même si le regroupement de connexions est utilisé et que les connexions sont simplement réinitialisées?

43
JohnnyM

Il peut rester ouvert pendant la mise en commun des connexions. Exemple: la temporisation 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

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

J'utilise toujours SET XACT_ABORT ON.

De ce blog de l'équipe SQL :

Notez qu'avec le regroupement de connexions, la simple fermeture de la connexion sans restauration ne renverra que la connexion au pool et la transaction restera ouverte jusqu'à sa réutilisation ou sa suppression ultérieure. Cela peut entraîner des verrous qui deviennent inutiles et provoquer d'autres délais d'expiration et un blocage du bloc

De MSDN , section "Prise en charge des transactions" (mon gras)

Lorsqu'une connexion est fermée, elle est libéré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'interrompre la transaction distribuée ultérieurement.

25
gbn

Les modifications non validées ne sont pas visibles en dehors de la connexion, donc l'heure de la restauration n'est pas pertinente. Alors oui, la transaction est finalement annulée.

9
Fozi

Le serveur annulera immédiatement toute transaction non engagée à la fermeture d'une session.
Le pool ADO est responsable de l'effacement de toute transaction non validée avant de retourner une transaction au pool. Si vous supprimez une connexion avec des transactions en attente, il sera annulé.

Les transactions peuvent être démarrées par le client à l'aide de l'API ADO (SqlConnection.BeginTransaction) ou en exécutant une instruction BEGIN TRANSACTION. Le protocole TDS entre le client et le serveur possède des jetons spéciaux informant le client lorsqu'une transaction a été effectuée démarré/validé comme ceci donc ADO sait que la connexion a des transactions en attente même si elles sont démarrées en code T-SQL.

6
Remus Rusanu