COMMIT TRANSACTION (Transact-SQL)
Markiert das Ende einer erfolgreichen impliziten oder expliziten Transaktion. Ist @@TRANCOUNT gleich 1, werden von COMMIT TRANSACTION alle Datenänderungen permanent gespeichert, die seit dem Start der Transaktion ausgeführt wurden. Außerdem werden die von der Transaktion belegten Ressourcen freigegeben, und @@TRANCOUNT wird auf 0 herabgesetzt. Ist @@TRANCOUNT größer als 1, wird @@TRANCOUNT von COMMIT TRANSACTION lediglich um den Wert 1 verringert, und die Transaktion bleibt aktiv.
Syntax
COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ]
[ ; ]
Argumente
transaction_name
Wird von SQL Server Database Engine (Datenbankmodul) ignoriert. transaction_name gibt einen Transaktionsnamen an, der von einer vorherigen BEGIN TRANSACTION-Anweisung zugewiesen wurde. transaction_name muss den Regeln für Bezeichner entsprechen, darf jedoch 32 Zeichen nicht überschreiten. transaction_name kann die Übersichtlichkeit verbessern, da den Programmierern angezeigt wird, welcher geschachtelten BEGIN TRANSACTION-Anweisung die COMMIT TRANSACTION-Anweisung zugeordnet ist.@tran_name_variable
Der Name einer benutzerdefinierten Variablen, die einen gültigen Transaktionsnamen enthält. Die Variable muss mit einem der Datentypen char, varchar, nchar oder nvarchar deklariert werden. Werden mehr als 32 Zeichen an die Variable übergeben, werden nur die ersten 32 Zeichen verwendet, die restlichen Zeichen werden abgeschnitten.
Hinweise
Es liegt in der Verantwortung des Transact-SQL-Programmierers, dass COMMIT TRANSACTION nur zu einem Zeitpunkt ausgeführt wird, zu dem alle Daten, auf die sich die Transaktion bezieht, logisch richtig sind.
War die Transaktion, für die ein Commit ausgeführt wird, eine verteilte Transact-SQL-Transaktion, wird MS DTC von COMMIT TRANSACTION veranlasst, mithilfe eines Zweiphasencommit-Protokolls für alle an der Transaktion beteiligten Server ein Commit auszuführen. Erstreckt sich eine lokale Transaktion über mehrere Datenbanken in derselben Instanz von Database Engine (Datenbankmodul), verwendet die Instanz ein internes Zweiphasencommit, um für alle an der Transaktion beteiligten Datenbanken einen Commit auszuführen.
Bei der Verwendung in geschachtelten Transaktionen werden durch Commits der inneren Transaktionen keine Ressourcen freigegeben oder Änderungen permanent gespeichert. Die Datenänderungen werden nur dann permanent, und Ressourcen werden nur dann freigegeben, wenn für die äußere Transaktion ein Commit ausgeführt wird. Bei jeder COMMIT TRANSACTION-Anweisung, die ausgeführt wird, wenn @@TRANCOUNT größer als 1 ist, wird @@TRANCOUNT einfach um 1 reduziert. Hat @@TRANCOUNT schließlich den Wert 0 erreicht, wird für die gesamte äußere Transaktion ein Commit ausgeführt. Da transaction_name von Database Engine (Datenbankmodul) ignoriert wird, wird beim Ausführen einer COMMIT TRANSACTION-Anweisung mit dem Namen einer äußeren Transaktion bei gleichzeitigem Vorhandensein ausstehender innerer Transaktionen @@TRANCOUNT lediglich um 1 verringert.
Hat @@TRANCOUNT den Wert 0, führt die Ausführung von COMMIT TRANSACTION zu einer Fehlermeldung, da keine entsprechende BEGIN TRANSACTION-Anweisung vorhanden ist.
Sie können nach der Ausführung einer COMMIT TRANSACTION-Anweisung kein Rollback für die Transaktion ausführen, da Datenänderungen zu einem dauerhaften Teil der Datenbank gemacht worden sind.
Database Engine (Datenbankmodul) in SQL Server 2000 und höher erhöht die Anzahl der Transaktionen in einer Anweisung nur, wenn die Anzahl beim Start der Anweisung 0 ist. In SQL Server, Version 7.0, wird die Anzahl der Transaktionen immer erhöht, unabhängig von der Anzahl beim Start der Anweisung. Daher kann der von @@TRANCOUNT in Triggern zurückgegebene Wert in SQL Server 2000 und höher niedriger sein als in SQL Server, Version 7.0.
Wenn in SQL Server 2000 und höher eine COMMIT TRANSACTION- oder COMMIT WORK-Anweisung in einem Trigger ausgeführt wird und keine entsprechende explizite oder implizite BEGIN TRANSACTION-Anweisung am Anfang des Triggers vorhanden ist, sehen Benutzer möglicherweise ein anderes Verhalten als in SQL Server, Version 7.0. Die Verwendung von COMMIT TRANSACTION- oder COMMIT WORK-Anweisungen in einem Trigger wird nicht empfohlen.
Berechtigungen
Erfordert die Mitgliedschaft in der public-Rolle.
Beispiele
A. Commitausführung für eine Transaktion
Im folgenden Beispiel wird ein Auftragskandidat gelöscht.
USE AdventureWorks2008R2;
GO
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION;
GO
B. Commit einer geschachtelten Transaktion
Im folgenden Beispiel werden eine Tabelle erstellt und drei Ebenen von geschachtelten Transaktionen generiert, und anschließend wird für die geschachtelte Transaktion ein Commit ausgeführt. Obwohl jede COMMIT TRANSACTION-Anweisung einen transaction_name-Parameter aufweist, gibt es keine Beziehung zwischen der COMMIT TRANSACTION-Anweisung und der BEGIN TRANSACTION-Anweisung. Die transaction_name-Parameter sind lediglich Hilfen zur Übersichtlichkeit, die dem Programmierer dabei helfen sollen, die richtige Anzahl von Commits zu codieren, damit @@TRANCOUNT auf 0 herabgesetzt und dadurch für die äußere Transaktion ein Commit ausgeführt wird.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'TestTran',N'U') IS NOT NULL
DROP TABLE TestTran;
GO
CREATE TABLE TestTran (Cola int PRIMARY KEY, Colb char(3));
GO
-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;
GO
PRINT N'Transaction count after BEGIN OuterTran = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (1, 'aaa');
GO
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
GO
PRINT N'Transaction count after BEGIN Inner1 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (2, 'bbb');
GO
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
GO
PRINT N'Transaction count after BEGIN Inner2 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
INSERT INTO TestTran VALUES (3, 'ccc');
GO
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
GO
PRINT N'Transaction count after COMMIT Inner2 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
GO
PRINT N'Transaction count after COMMIT Inner1 = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
GO
PRINT N'Transaction count after COMMIT OuterTran = '
+ CAST(@@TRANCOUNT AS nvarchar(10));
GO