Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

21. Juli 2009 um 21:17

Command-Timeout hinterlässt offene Transaktionen

In der gestrigen Liste kommen jede Menge Timeouts vor, die zu einer Fehlermeldung bei der Bearbeitung von SQL-Befehlen führen können. Heute stellten wir fest, dass ein "Command Timeout" in der Anwendung (also am Client) am SQL-Server zu offenen Transaktionen führen können.

Beispiel: Die Anwendung schickt einen SQL-Batch an den SQL-Server der am Stück ausgeführt werden soll:

BEGIN TRANSACTION;
INSERT …. SELECT ….; – irgendetwas schrecklich Langes
COMMIT;

Wenn das zu lange dauert und das Client-API daher einen Command-Timeout wirft, dann schickt der Client per TDS einen "Cancel" zum Server. Das sah ich leider nur mit dem NetMon, nicht via Profiler. Der SQL-Server unterbricht dann sofort die Ausführung des aktuellen Batches. Aus dem Batch wird kein weiterer Befehl ausgeführt. Auch kein ROLLBACK, dass in einem CATCH-Block im SQL-Batch enthalten ist. Die Transaktion bleibt einfach offen. Damit hatte ich nicht gerechnet.

Daher muss man in der Fehlerbehandlung der Anwendung immer mal noch einen SQL-Befehl über die Connection schicken, selbst wenn die Transaktion komplett als Batch an den SQL-Server geschickt wurde. Das geht beispielsweise mit einem bedingten ROLLBACK:

IF @@TRANCOUNT > 0 ROLLBACK;

Ausprobiert haben wir ODBC und ADO.net. Bei beiden war es so. Bei ODBC mag es ja meistens noch gereicht haben die Connection einfach zu beenden, was zu einem Rollback führt. Bei ADO.net reicht das normalerweise nicht. Hier ist der bedingte ROLLBACK-Befehl fast immer nötig, weil bei ADO.net in der Regel Connection-Pooling verwendet wird: eine geschlossene Verbindung wandert zurück in den Pool, sie wird nicht wirklich geschlossen. Erst beim Rausholen aus dem Pool wird zum Zweck des Recycling ein "Reset" auf der Connection abgesetzt, dass alle Optionen zurücksetzt, Transaktionen schließt und Sperren freigibt. Diese Kombination kann dazu führen, dass Zombi-Sperren sehr lange gehalten werden und zu einem hübschen Blockierungsproblem führen… 😉

21. Juli 2009 um 20:56

Lieber Freund!!!

Irgendwie reißt das nicht mehr ab. Hier ist schon wieder einer…

Betreff: Lieber Freund!!!
Datum: Tue, 21 Jul 2009 10:10:09 -0300
Von: Herr MARTINS WEBER DITO
Antwort an: Herr MARTINS WEBER DITO
An: undisclosed-recipients:;

Lieber Freund!!!

Ich vermute das diese E-Mail eine Überraschung für Sie sein wird, aber es ist wahr.Ich bin bei einer routinen Überprüfung in meiner Bank (Standard Bank von Süd Afrika) wo ich arbeite, auf einem Konto gestoßen, was nicht in anspruch genommen worden ist, wo derzeit $12,500,000 (zwölfmillionenfünfhundert US Dollar) gutgeschrieben sind.

Dieses Konto gehörte Herrn Manfred Becker, der ein Kunde in unsere Bank war, der leider verstorben ist. Herr Becker war ein gebürtiger Deutscher.Damit es mir möglich ist dieses Geld $12,500,000 inanspruch zunehmen, benötige ich die zusammenarbeit eines Ausländischen Partners wie Sie,den ich als Verwandter und Erbe des verstorbenen Herrn Becker vorstellen kann,damit wir das Geld inanspruch nehmen können.

Für diese Unterstützung erhalten Sie 30% der Erbschaftsumme und die restlichen 70% teile ich mir mit meinen zwei Arbeitskollegen, die mich bei dieser Transaktion ebenfalls unterstützen.Wenn Sie interessiert sind, können Sie mir bitte eine E-Mail schicken, damit ich Ihnen mehr Details
zukommen lassen kann. Schicken Sie bitte Ihre Antwort auf diese E-Mail Adresse: (ditoweber@aim.com )

Mit freundlichen Grüßen

Herr MARTINS WEBER DITO

Wer wissen will, was man da angeblich alles vorlegen muss und wann man Geld für die Bearbeitung zahlen muss, findet die Fortsetzung bei aktiv-gegen-spam.de. Dort wird beschrieben, dass man eine eidesstattliche Erklärung abgeben müsse ein Verwandter zu sein. Oha, da ist man dann aber erpressbar…

|