BEGIN TRANSACTION (Transact-SQL)
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL verwaltete Instanz
Azure Synapse Analytics Platform
System (PDW)
Warehouse in Microsoft Fabric
Markiert den Anfang einer expliziten lokalen Transaktion. Explizite Transaktionen beginnen mit der BEGIN TRANSACTION
Anweisung und enden mit der COMMIT
Oder-Anweisung ROLLBACK
.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Syntax für Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Analytics Platform System (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Hinweis
Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.
Argumente
transaction_name
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz
Der Name, der der Transaktion zugewiesen ist. transaction_name müssen den Regeln für Bezeichner entsprechen, aber Bezeichner, die länger als 32 Zeichen sind, sind nicht zulässig. Verwenden Sie Transaktionsnamen nur für das äußerste Paar geschachtelter BEGIN...COMMIT
oder BEGIN...ROLLBACK
Anweisungen. bei transaction_name wird immer die Groß-/Kleinschreibung beachtet, auch wenn bei der Sql Server-Instanz die Groß-/Kleinschreibung nicht beachtet wird.
@tran_name_variable
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz
Der Name einer benutzerdefinierten Variablen, die einen gültigen Transaktionsnamen enthält. Die Variable muss mit einem der folgenden Datentypen deklariert werden: char, varchar, nchar oder nvarchar. Wenn mehr als 32 Zeichen an die Variable übergeben werden, werden nur die ersten 32 Zeichen verwendet. Die verbleibenden Zeichen werden abgeschnitten.
WITH MARK [ 'Beschreibung' ]
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz
Gibt an, dass die Transaktion im Protokoll markiert wird. Eine Beschreibung ist eine Zeichenfolge, die die Markierung beschreibt. Eine Beschreibung , die länger als 128 Zeichen ist, wird vor dem Speichern in der msdb.dbo.logmarkhistory
Tabelle auf 128 Zeichen abgeschnitten.
Bei WITH MARK
Verwendung muss ein Transaktionsname angegeben werden. WITH MARK
ermöglicht das Wiederherstellen eines Transaktionsprotokolls in ein benanntes Zeichen.
Hinweise
BEGIN TRANSACTION
inkrementiert @@TRANCOUNT
um 1
.
BEGIN TRANSACTION
stellt einen Punkt dar, an dem die durch eine Verbindung referenzierten Daten logisch und physisch konsistent sind. Wenn Fehler auftreten, können alle Datenänderungen, die nach dem BEGIN TRANSACTION
Rollback vorgenommen wurden, zurückgesetzt werden, um die Daten an diesen bekannten Konsistenzzustand zurückzugeben. Jede Transaktion dauert, bis sie ohne Fehler abgeschlossen ist und COMMIT TRANSACTION
ausgegeben wird, um die Änderungen an einem dauerhaften Teil der Datenbank vorzunehmen, oder Fehler sind aufgetreten, und alle Änderungen werden mit einer ROLLBACK TRANSACTION
Anweisung gelöscht.
BEGIN TRANSACTION
startet eine lokale Transaktion für die Verbindung, die die Anweisung ausgibt. Abhängig von den einstellungen der aktuellen Transaktionsisolationsstufe werden viele Ressourcen, die zur Unterstützung der von der Verbindung ausgegebenen Transact-SQL-Anweisungen erworben wurden, von der Transaktion gesperrt, bis sie mit einer oder ROLLBACK TRANSACTION
einer COMMIT TRANSACTION
Anweisung abgeschlossen ist. Längere Zeit ausstehende Transaktionen können verhindern, dass andere Anwender auf diese gesperrten Ressourcen zugreifen und dass Protokolle abgeschnitten werden.
Obwohl BEGIN TRANSACTION
eine lokale Transaktion gestartet wird, wird sie erst im Transaktionsprotokoll aufgezeichnet, wenn die Anwendung dann eine Aktion ausführt, die im Protokoll aufgezeichnet werden muss, z. B. das Ausführen eines , UPDATE
oder DELETE
einer INSERT
Anweisung. Eine Anwendung kann Aktionen wie das Abrufen von Sperren ausführen, um die Transaktionsisolationsstufe von SELECT
Anweisungen zu schützen, im Protokoll wird jedoch nichts aufgezeichnet, bis die Anwendung eine Änderungsaktion ausführt.
Das Benennen mehrerer Transaktionen in einer Reihe von geschachtelten Transaktionen mit einem Transaktionsnamen hat kaum Auswirkungen auf die Transaktion. Nur der erste (äußerste) Transaktionsname wird im System registriert. Ein Rollback zu einem anderen Namen (der kein gültiger Sicherungspunktname ist) erzeugt einen Fehler. Für keine der Anweisungen, die vor dem Rollback ausgeführt werden, wird zum Zeitpunkt des Auftretens dieses Fehlers ein Rollback ausgeführt. Für die Anweisungen wird erst dann ein Rollback ausgeführt, wenn für die äußere Transaktion ein Rollback ausgeführt wird.
Die von der BEGIN TRANSACTION
Anweisung gestartete lokale Transaktion wird an eine verteilte Transaktion eskaliert, wenn die folgenden Aktionen ausgeführt werden, bevor die Anweisung zugesichert oder zurückgesetzt wird:
Eine
INSERT
,DELETE
oder Eine Anweisung,UPDATE
die auf eine Remotetabelle auf einem verknüpften Server verweist, wird ausgeführt. DieINSERT
,UPDATE
oderDELETE
Anweisung schlägt fehl, wenn der OLE DB-Anbieter, der für den Zugriff auf den verknüpften Server verwendet wird, dieITransactionJoin
Schnittstelle nicht unterstützt.Ein Aufruf an eine remote gespeicherte Prozedur erfolgt, wenn die
REMOTE_PROC_TRANSACTIONS
Option auf "ON
.
Die lokale Kopie von SQL Server wird zum Transaktionscontroller und verwendet Microsoft Distributed Transaction Coordinator (MS DTC), um die verteilte Transaktion zu verwalten.
Eine Transaktion kann mithilfe einer BEGIN DISTRIBUTED TRANSACTION
verteilten Transaktion explizit ausgeführt werden. Weitere Informationen finden Sie unter BEGIN DISTRIBUTED TRANSACTION.
Wenn SET IMPLICIT_TRANSACTIONS
diese Eigenschaft auf <BEGIN TRANSACTION
Anweisung zwei geschachtelte Transaktionen. Weitere Informationen finden Sie unter SET IMPLICIT_TRANSACTIONS.
Markierte Transaktionen
Die WITH MARK
Option bewirkt, dass der Transaktionsname im Transaktionsprotokoll platziert wird. Wenn Sie eine Datenbank in einem früheren Zustand wiederherstellen, kann die markierte Transaktion anstelle eines Datums und einer Uhrzeit verwendet werden. Weitere Informationen finden Sie unter Verwendung von markierten Transaktionen zum Wiederherstellen verwandter Datenbanken konsistent und RESTORE-Anweisungen.
Transaktionsprotokollmarkierungen sind außerdem erforderlich, wenn Sie eine Gruppe von zusammenhängenden Datenbanken in einem logisch konsistenten Status wiederherstellen müssen. Markierungen können von einer verteilten Transaktion in den Transaktionsprotokollen der zusammenhängenden Datenbanken abgelegt werden. Das Wiederherstellen der Gruppe von zusammenhängenden Datenbanken entsprechend diesen Markierungen ergibt eine Gruppe von Datenbanken, die hinsichtlich der Transaktionen konsistent sind. Das Ablegen von Markierungen in zusammenhängenden Datenbanken erfordert spezielle Prozeduren.
Die Markierung wird nur dann im Transaktionsprotokoll abgelegt, wenn die Datenbank durch die markierte Transaktion aktualisiert wird. Transaktionen, die keine Daten ändern, werden nicht markiert.
BEGIN TRANSACTION <new_name> WITH MARK
kann in einer bereits vorhandenen Transaktion geschachtelt werden, die nicht markiert ist. Auf diese <new_name>
Weise wird der Markenname für die Transaktion, trotz des Namens, den die Transaktion möglicherweise bereits erhalten hat. Im folgenden Beispiel ist M2
der Name der Markierung.
BEGIN TRAN T1;
UPDATE table1 ...;
BEGIN TRAN M2 WITH MARK;
UPDATE table2 ...;
SELECT * from table1;
COMMIT TRAN M2;
UPDATE table3 ...;
COMMIT TRAN T1;
Wenn Sie Transaktionen verschachteln, erhalten Sie die folgende Warnmeldung, wenn Sie versuchen, eine bereits markierte Transaktion zu markieren:
Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.
Berechtigungen
Erfordert die Mitgliedschaft in der public -Rolle.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
A. Verwenden einer expliziten Transaktion
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL verwaltete Instanz, Azure Synapse Analytics, Analytics Platform System (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. Ausführen eines Rollbacks für eine Transaktion
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL verwaltete Instanz, Azure Synapse Analytics, Analytics Platform System (PDW)
Im folgenden Beispiel werden die Auswirkungen des Rollbacks einer Transaktion veranschaulicht. In diesem Beispiel wird die ROLLBACK
Anweisung zurückgesetzt INSERT
, aber die erstellte Tabelle ist weiterhin vorhanden.
CREATE TABLE ValueTable (id INT);
BEGIN TRANSACTION;
INSERT INTO ValueTable VALUES(1);
INSERT INTO ValueTable VALUES(2);
ROLLBACK;
C. Benennen einer Transaktion
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL verwaltete Instanz
Im folgenden Beispiel wird gezeigt, wie eine Transaktion benannt wird.
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
D: Markieren einer Transaktion
Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL verwaltete Instanz
Im folgenden Beispiel wird gezeigt, wie eine Transaktion markiert wird. Die Transaktion CandidateDelete
wird markiert.
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
GO
USE AdventureWorks2022;
GO
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO