Dienstag, 19. März 2013

TRANSACTION! COMMIT? ROLLBACK?

Oft sieht mit in SQL-Skripten, die mit Transaktionen arbeiten folgende oder ähnliche Abfrage:

-- Transaktion rückgängig machen
IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION; 

Aber was genau steckt eigentlich dahinter?
Eigentlich ist diese Abfrage mehr oder weniger Quatsch bzw. falsch.

Die globale Variable @@TRANCOUNT gibt nur die Anzahl der mit "BEGIN TRANSACTION" geöffneten Transaktionen zurück.
Das heißt, an dieser Stelle wird geprüft, ob es eine offene Transaktion gibt. Wenn dieses der Fall ist, dann wird eine (die zuletzt geöffnete) geschlossen.

An dieser Stelle weiß man jedoch nicht, ob die Transaktion erfolgreich oder fehlerhaft war.
Also könnte man auch nicht sagen, ob diese bestätigt (commit) oder zurückgeschrieben (rollback) werden sollen.
Diese Information bekommt man aber ganz einfach direkt über eine SQL-Server-Funktion.

Über die Systemfunktion XACT_STATE() kann der aktuelle Transaktionsstatus manuell geprüft werden.
Mögliche Rückgabewerte sind folgende:
# 1 => Es ist eine Transaktion vorhanden, die korrekt verarbeitet wurde und committed werden kann.
# 0 => Es ist keine Transaktion vorhanden.
# -1 => Es ist eine Transaktion vorhanden, die aber fehlerhaft verarbeitet wurde und nicht committed werden kann. Diese Transaktion kann nur noch vollständig per ROLLBACK zurückgeschrieben werden.

Anhand dieser Funktion kann man also die Transaktion bzw. dessen Status prüfen und diese bestätigen oder zurückschreiben.

Möchte man die Transaktion nicht manuell zurückschreiben, dann könnte man dieses auch automatisch vom SQL-Server machen lassen. In diesem Fall gilt nur zu beachten, dass die Transaktion trotzdem bei erfolg bestätigt werden muss.

XACT_ABORT(ON/OFF) ist eine Eigenschaft die über SET beliebig eingestellt werden kann.
Diese Eigenschaft gibt an ob eine fehlgeschlagene Transaktion automatisch zurückgeschrieben werden soll.

Keine Kommentare:

Kommentar veröffentlichen