Wir haben eine Client-App, auf der SQL auf einem SQL Server 2005 ausgeführt wird, z.
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Es wird von einem langen String-Befehl gesendet.
Wenn eine der Einfügungen fehlschlägt oder ein Teil des Befehls fehlschlägt, setzt SQL Server die Transaktion zurück? Wenn es nicht zurückgesetzt wird, muss ich einen zweiten Befehl senden, um es zurückzusetzen?
Ich kann Angaben zur API und Sprache machen, die ich verwende, aber ich denke, SQL Server sollte für jede Sprache gleich reagieren.
sql
sql-server
sql-server-2005
transactions
Jonathanpeppers
quelle
quelle
Antworten:
Sie können
set xact_abort on
vor Ihre Transaktion stellen, um sicherzustellen, dass SQL im Fehlerfall automatisch zurückgesetzt wird.quelle
xact_abort
befindet sich auf der Verbindungsebene.Sie haben insofern Recht, als die gesamte Transaktion zurückgesetzt wird. Sie sollten den Befehl zum Zurücksetzen eingeben.
Sie können dies
TRY CATCH
wie folgt in einen Block einschließenquelle
try
) zurückgesetzt, aber der Code schlägt danach fehl. Es gibt keine Transaktion mehr, aber Sie gehen immer noch in diecatch
.Hier der Code zum Abrufen der Fehlermeldung beim Arbeiten mit MSSQL Server 2016:
quelle
DECLARE @Var TYPE; SET @Var = ERROR;
für das Auslösen von Fehlern in SQL Server 2005 verwenden. Andernfalls funktioniert der obige Code zum Auslösen von Fehlern auch für ältere DBs. Der Versuch, einer lokalen Variablen einen Standardwert zuzuweisen, verursachte Probleme.Aus dem MDSN-Artikel Steuern von Transaktionen (Datenbankmodul) .
In Ihrem Fall wird die gesamte Transaktion zurückgesetzt, wenn eine der Einfügungen fehlschlägt.
quelle
Nein, tut es nicht.
Sicher, sollten Sie ausgeben
ROLLBACK
stattCOMMIT
.Wenn Sie entscheiden möchten, ob die Transaktion festgeschrieben oder zurückgesetzt werden soll, sollten Sie den
COMMIT
Satz aus der Anweisung entfernen , die Ergebnisse der Einfügungen überprüfen und dann entwederCOMMIT
oderROLLBACK
abhängig von den Ergebnissen der Prüfung ausgeben .quelle
Named Pipes
oderTCP
) die Verbindung. Wenn eine Verbindung unterbrochen wird, werdenSQL Server
alle derzeit ausgeführten Befehle gestoppt und die Transaktion zurückgesetzt.