Share via


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-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 neu Standard 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 , UPDATEoder DELETE einer INSERTAnweisung. 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, DELETEoder Eine Anweisung, UPDATE die auf eine Remotetabelle auf einem verknüpften Server verweist, wird ausgeführt. Die INSERT, UPDATEoder DELETE Anweisung schlägt fehl, wenn der OLE DB-Anbieter, der für den Zugriff auf den verknüpften Server verwendet wird, die ITransactionJoin 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 TRANSACTIONverteilten Transaktion explizit ausgeführt werden. Weitere Informationen finden Sie unter BEGIN DISTRIBUTED TRANSACTION.

Wenn SET IMPLICIT_TRANSACTIONS diese Eigenschaft auf <a0/> festgelegt ist, erstellt eine 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-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