Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was passiert mit einer nicht festgeschriebenen Transaktion, wenn die Verbindung geschlossen wird?

Es kann geöffnet bleiben, während das Verbindungspooling angewendet wird. Beispiel:Befehls-Timeout kann Sperren und TXN hinterlassen, weil der Client als "Abbruch" sendet.

2 Lösungen:

  • Test im Client wörtlich:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • Verwenden Sie SET XACT_ABORT ON um sicherzustellen, dass ein TXN bereinigt wird:Frage 1 und Frage 2

Ich verwende immer SET XACT_ABORT ON .

Aus diesem Blog des SQL-Teams:

Beachten Sie, dass beim Connection Pooling das einfache Schließen der Verbindung ohne Rollback nur die Verbindung an den Pool zurückgibt und die Transaktion offen bleibt, bis sie später wiederverwendet oder aus dem Pool entfernt wird. Dies kann dazu führen, dass Sperren unnötigerweise aufrechterhalten werden und andere Zeitüberschreitungen und fortlaufende Blockierungen verursachen

Von MSDN, Abschnitt „Transaction Support“ (mein Fettdruck)

Wenn eine Verbindung geschlossen wird, wird sie basierend auf ihrem Transaktionskontext zurück in den Pool und in die entsprechende Unterteilung freigegeben. Daher können Sie die Verbindung schließen, ohne einen Fehler zu generieren, auch wenn eine verteilte Transaktion noch aussteht. Dadurch können Sie die verteilte Transaktion zu einem späteren Zeitpunkt festschreiben oder abbrechen.