BEGIN TRANSACTION (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 ROLLBACK-Anweisung.

Transact-SQL-Syntaxkonventionen

Syntax

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Synapse Data Warehouse in Microsoft Fabric, Azure Synapse Analytics and Parallel Data Warehouse
 
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öher, Azure SQL-Datenbank

Der Name, der der Transaktion zugewiesen ist. transaction_name muss den Regeln für Bezeichner entsprechen. Bezeichner mit mehr als 32 Zeichen sind jedoch nicht zulässig. Verwenden Sie Transaktionsnamen nur beim äußersten Paar von geschachtelten BEGIN...COMMIT- bzw. BEGIN...ROLLBACK-Anweisungen. transaction_name berücksichtigt immer die Groß-/Kleinschreibung, auch wenn die Instanz von SQL Server nicht zwischen Groß- und Kleinschreibung unterscheidet.

@tran_name_variable
Gilt für: SQL Server 2008 (10.0.x) und höher, Azure SQL-Datenbank

Ist 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. Werden mehr als 32 Zeichen an die Variable übergeben, werden nur die ersten 32 Zeichen verwendet; alle übrigen Zeichen werden abgeschnitten.

WITH MARK [ 'Beschreibung' ]
Gilt für: SQL Server 2008 (10.0.x) und höher, Azure SQL-Datenbank

Gibt an, dass die Transaktion im Protokoll markiert wird. Eine Beschreibung ist eine Zeichenfolge, die die Markierung beschreibt. Wenn die Beschreibung länger als 128 Zeichen ist, wird sie bei 128 Zeichen abgeschnitten, bevor sie in der Tabelle „msdb.dbo.logmarkhistory“ gespeichert wird.

Wenn WITH MARK verwendet wird, muss ein Transaktionsname angegeben sein. WITH MARK ermöglicht es, ein Transaktionsprotokoll bis zu einer benannten Markierung wiederherzustellen.

Allgemeine Hinweise

BEGIN TRANSACTION erhöht @@TRANCOUNT um 1.

BEGIN TRANSACTION stellt einen Punkt dar, an dem die Daten, auf die eine Verbindung verweist, logisch und physisch konsistent sind. Werden Fehler entdeckt, kann für alle Datenänderungen, die nach der BEGIN TRANSACTION-Anweisung vorgenommen wurden, ein Rollback ausgeführt werden, um die Daten auf diesen bekannten Konsistenzstatus zurückzusetzen. Jede Transaktion dauert so lange, bis sie entweder fehlerfrei abgeschlossen und COMMIT TRANSACTION zum dauerhaften Speichern der Änderungen in der Datenbank ausgegeben wird oder bis Fehler festgestellt und alle Änderungen mit der ROLLBACK TRANSACTION-Anweisung gelöscht werden.

Mit BEGIN TRANSACTION wird eine lokale Transaktion für die Verbindung gestartet, die die Anweisung ausgibt. Abhängig von den aktuellen Einstellungen der Transaktionsisolationsstufe werden viele Ressourcen, die zur Unterstützung der von der Verbindung ausgegebenen Transact-SQL-Anweisungen abgerufen werden, so lange von der Transaktion gesperrt, bis diese entweder mit einer COMMIT TRANSACTION- oder einer ROLLBACK TRANSACTION-Anweisung abgeschlossen wurde. Längere Zeit ausstehende Transaktionen können verhindern, dass andere Anwender auf diese gesperrten Ressourcen zugreifen und dass Protokolle abgeschnitten werden.

BEGIN TRANSACTION startet zwar eine lokale Transaktion, es erfolgt jedoch so lange keine Aufzeichnung im Transaktionsprotokoll, bis die Anwendung nachfolgend eine Aktion ausführt, die im Protokoll aufgezeichnet werden muss, wie z. B. das Ausführen einer INSERT-, UPDATE- oder DELETE-Anweisung. Eine Anwendung kann Aktionen ausführen (wie z. B. das Aktivieren von Sperren, um die Transaktionsisolationsstufe von SELECT-Anweisungen zu schützen), ohne dass irgendwelche Einträge im Protokoll aufgezeichnet werden. Dies geschieht erst, wenn 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 zu einer verteilten Transaktion ausgeweitet, wenn folgende Aktionen vor einem Commit oder Rollback der Transaktion ausgeführt werden:

  • Es wird eine INSERT-, DELETE- oder UPDATE-Anweisung ausgeführt, die auf eine Remotetabelle auf einem Verbindungsserver verweist. Bei der Anweisung INSERT, UPDATE oder DELETE tritt ein Fehler auf, wenn der für den Zugriff auf den Verbindungsserver verwendete OLE DB-Anbieter die ITransactionJoin-Schnittstelle nicht unterstützt.

  • Eine remote gespeicherte Prozedur wird aufgerufen, wenn die Option REMOTE_PROC_TRANSACTIONS auf ON festgelegt ist.

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 von BEGIN DISTRIBUTED TRANSACTION explizit als verteilte Transaktion ausgeführt werden. Weitere Informationen finden Sie unter BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Wenn SET IMPLICIT_TRANSACTIONS auf ON festgelegt ist, werden durch eine BEGIN TRANSACTION-Anweisung zwei geschachtelte Transaktionen erstellt. Weitere Informationen finden Sie unter SET IMPLICIT_TRANSACTIONS (Transact-SQL).

Markierte Transaktionen

Die Option WITH MARK bewirkt, dass der Transaktionsname im Transaktionsprotokoll abgelegt wird. Wenn eine Datenbank in einem früheren Status wiederhergestellt wird, kann die markierte Transaktion statt eines Datums und einer Uhrzeit verwendet werden. Weitere Informationen finden Sie unter Wiederherstellen von verwandten Datenbanken mithilfe von markierten Transaktionen (vollständiges Wiederherstellungsmodell) und RESTORE (Transact-SQL).

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 TRAN new_name WITH MARK kann innerhalb einer vorhandenen Transaktion, die nicht markiert ist, geschachtelt werden. Ist dies der Fall, wird new_name der Markierungsname der Transaktion, und zwar unabhängig von dem Namen, den die Transaktion möglicherweise bereits 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;  

Beim Schachteln von Transaktionen führt der Versuch, eine bereits markierte Transaktion zu markieren, zu einer Warnmeldung (nicht zu einer Fehlermeldung):

"BEGIN TRAN T1 WITH MARK ...;"

"UPDATE table1 ...;"

"BEGIN TRAN M2 WITH MARK ...;"

"Server: Meldung 3920, Ebene 16, Status 1, Zeile 3"

"Die Option WITH MARK gilt nur für die erste BEGIN TRAN WITH MARK-Anweisung."

"Die Option wird ignoriert."

Berechtigungen

Erfordert die Mitgliedschaft in der public-Rolle.

Beispiele

A. Verwenden expliziter Transaktionen

Gilt für: SQL Server 2008 (10.0.x) und höher, Azure SQL-Datenbank, Azure Synapse Analytics, Parallel Data Warehouse

In diesem Beispiel wird AdventureWorks verwendet.

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öher, Azure SQL-Datenbank, Azure Synapse Analytics, Parallel Data Warehouse

Im folgenden Beispiel werden die Auswirkungen des Rollbacks einer Transaktion veranschaulicht. In diesem Beispiel führt die ROLLBACK-Anweisung ein Rollback der INSERT-Anweisung aus, die erstellte Tabelle bleibt jedoch 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öher, Azure SQL-Datenbank

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öher, Azure SQL-Datenbank

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  

Weitere Informationen

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)