Transaktion in 2000 und 2005

10/02/2009 - 17:52 von Christoph Marx | Report spam
Hallo NGler,

ich habe hier ein Problem mit einem Skript, mit dem ich ein Datenbankupdate
durchführen möchte.
Hier ein kleiner Ausschnitt zur Veranschaulichung, das Original ist knapp
1000 Zeilen lang:
SET XACT_ABORT ON; -- damit erfolgt laut BOL bei einem Fehler ein
Rollback für die komplette Transaktion
GO
BEGIN TRANSACTION;
GO
IF @@TRANCOUNT > 0
BEGIN
ALTER TABLE Zeiten ADD ID uniqueidentifier NOT NULL CONSTRAINT DF_Zeiten_ID
DEFAULT (newid());
ALTER TABLE Zeiten ADD IDPers uniqueidentifier NOT NULL CONSTRAINT
DF_Zeiten_IDPers DEFAULT ('00000000-0000-0000-0000-000000000000');
END
GO
IF @@TRANCOUNT > 0
BEGIN
UPDATE Zeiten SET IDPers = (SELECT ID FROM Personal WHERE (Personal.Mandant
= Zeiten.Mandant) AND (Personal.Personalnummer = Zeiten.Personalnummer));
END
GO
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRANSACTION;
END

Das ganze funktioniert tadellos auf einem SQL 2005. Bei einem Fehler wird
die komplette Transaktion zurückgesetzt und meine DB ist wieder im
Originalzustand. Lasse ich das ganze auf einem SQL 2000 laufen und
provoziere einen Fehler, wird die Transaktion NICHT zurückgesetzt.
@@TRANCOUNT wird nicht auf 0 gesetzt und ich erhalte natürlich Folgefehler
ohne Ende. Ich hatte gehofft, dass ich mit dieser Methode das gleiche Skript
für 2000 und 2005 nutzen kann und daher bewusst auf Konstrukte wie TRY/CATCH
verzichtet. Ich habs auch schon ohne die GO's versucht, aber dann
funktioniert das UPDATE nicht mehr, weil die Spalte IDPers noch nicht
vorhanden ist.
Im Moment bin ich mit meinem Latein am Ende und wàre für einen Hinweis
dankbar, wie ich das ganze in den Griff bekommen kann.

Vorab schon mal besten Dank
Chris
 

Lesen sie die antworten

#1 Olaf Helper
11/02/2009 - 06:52 | Warnen spam
Hallo Christoph,

SET XACT_ABORT ON; -- damit erfolgt laut BOL bei einem Fehler ein
Rollback für die komplette Transaktion



Fast; das XACT_ABORT bezieht sich auf "verteilte Transaktion", bei Dir ist
es aber eine lokale Transkation.

Wenn im Fehlerfall ein Rollback erfolgen soll, dann solltest Du auch
explizit ein TRANS ROLLBACK ausführen und nicht nur bei Erfolg ein COMMIT.
Sonst kommt nàmlich noch zum Tragen, ob ein Auto-Commit erfolgt (siehe BOL
unter "Autocommit-Transaktionen")

MfG,
Olaf Helper

Ähnliche fragen