2009-10-08 4 views

Répondre

22

Il peut rester ouvert pendant la mise en pool des connexions. Exemple: commande timeout peut laisser des verrous et TXN car le client envoie comme "abort".

2 solutions:

  • test dans le client, littéralement:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

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

J'utilise toujours SET XACT_ABORT ON.

De this SQL Team blog:

Notez que la mise en commun de connexion, simplement fermer la connexion sans un rollback renverrons seulement la connexion à la piscine et la transaction restera ouverte jusqu'à plus tard réutilisés ou enlevés de la piscine. Cela peut entraîner des serrures begin tenu inutile et causer d'autres délais d'attente et bloc roulant

De MSDN, la section « Support de transaction » (mon gras)

Lorsqu'une connexion est fermée, il est libéré dans le pool et dans la subdivision appropriée basée sur son contexte de transaction. Par conséquent, vous pouvez fermer la connexion sans générant une erreur, même si une transaction distribuée est toujours en attente.Cela vous permet de valider ou abandonner la transaction distribuée à une date ultérieure .

+1

La mise en pool des connexions se fait du côté client, donc si le client annule une connexion en interne sans la fermer réellement, il est responsable de l'annulation ou de tout ce dont il a besoin pour résoudre cette situation. – Fozi

+0

@Fozi: sauf si SET XACT_ABORT est activé. – gbn

10

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

+9

Mais il peut bloquer d'autres connexions (en attente d'une validation/rollback) en fonction de votre isolement de sorte que le moment est encore importante. –

+2

Correct, mais l'accent est "finalement", ce qui est une * mauvaise chose * – gbn

+0

Je suppose qu'il est annulé dès que la connexion TCP (ou autre) est connue pour être fermée/cassée. Pour le regroupement de connexions, voir la réponse de gbn. – Fozi

6

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

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 a des jetons spéciaux informant le client lorsqu'une transaction a été démarrée/validée comme ceci afin qu'ADO sache que la connexion a des transactions en attente même si elles sont démarrées en code T-SQL.

Questions connexes