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.
Transact-SQL-Syntaxkonventionen
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
Ist 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.
Nach der Ausführung einer COMMIT TRANSACTION-Anweisung kann kein Rollback für die Transaktion ausgeführt werden, da Datenänderungen zu einem dauerhaften Bestandteil der Datenbank geworden sind.
Die Anzahl der Transaktionen in einer Anweisung wird von Database Engine (Datenbankmodul) nur erhöht, wenn die Anzahl der Transaktionen beim Start der Anweisung 0 (Null) ist.
Berechtigungen
Erfordert die Mitgliedschaft in der public-Rolle.
Beispiele
A.Commit einer Transaktion
Im folgenden Beispiel wird ein Auftragskandidat gelöscht.
USE AdventureWorks2012;
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 AdventureWorks2012;
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
Siehe auch
Verweis
BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
BEGIN TRANSACTION (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)