Freigeben über


TRANSAKTION BEGINNEN (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)Lagerhaus in Microsoft FabricSQL-Datenbank 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, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Syntax für Fabric Data Warehouse, Azure Synapse Analytics und Analytics Platform System (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Arguments

transaction_name

Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.

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 von BEGIN...COMMIT oder BEGIN...ROLLBACK Anweisungen. bei transaction_name wird immer die Groß-/Kleinschreibung beachtet, auch wenn bei der Datenbankmodulinstanz keine Groß-/Kleinschreibung beachtet wird.

@tran_name_variable

Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.

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, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric.

Gibt an, dass die Transaktion im Transaktionsprotokoll markiert ist. 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 auf einen durch die Markierung identifizierten Punkt.

Remarks

BEGIN TRANSACTION inkrementiert @@TRANCOUNT um 1.

BEGIN TRANSACTION stellt einen Punkt dar, an dem die von einer Sitzung referenzierten Daten einen bestimmten Konsistenzstatus aufweisen. Alle Datenänderungen, die vorgenommen wurden, nachdem das BEGIN TRANSACTION Rollback ausgeführt werden kann, um die Daten an diesen bekannten Konsistenzstatus zurückzugeben. Jede Transaktion dauert, bis COMMIT TRANSACTION sie ausgestellt wird, um die Änderungen an einem dauerhaften Teil der Datenbank vorzunehmen, oder alle Änderungen werden mit einer ROLLBACK TRANSACTION Anweisung gelöscht.

Eine Transaktion kann automatisch zurückgesetzt werden, wenn ein Transaktionsabbruchfehler auftritt oder wenn ein Laufzeitfehler auftritt und die XACT_ABORT Sitzungsoption auf ON". Weitere Informationen finden Sie unter SET XACT_ABORT.

BEGIN TRANSACTION startet eine lokale Transaktion für die Sitzung, die die Anweisung ausgibt. Je nach den einstellungen der aktuellen Transaktionsisolationsstufe werden die von der Sitzung ausgegebenen Transact-SQL Anweisungen durch die Transaktion gesperrt, bis sie mit einer oder ROLLBACK TRANSACTION einer COMMIT TRANSACTION Anweisung abgeschlossen ist. Transaktionen, die für lange Zeiträume ausstehen, können verhindern, dass andere Sitzungen auf diese gesperrten Ressourcen zugreifen, und die Bereinigung des Transaktionsprotokolls und des Versionsspeichers verhindern.

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 , INSERToder UPDATE einer DELETEAnweisung. Nachdem eine Transaktion gestartet wurde, kann das Datenbankmodul Aktionen ausführen, z. B. das Abrufen von Sperren zum Schutz der Transaktionsisolationsstufe von SELECT Anweisungen, aber nichts wird im Transaktionsprotokoll aufgezeichnet, bis die Anwendung eine Änderungsaktion ausführt.

Nach der Ausgabe BEGIN TRANSACTIONkönnen Sie erneut ausgeben BEGIN TRANSACTION , um eine oder mehrere innere Transaktionen zu starten. Obwohl Sie transaction_name für eine innere Transaktion angeben können, wird nur der erste (äußerste) Transaktionsname beim System registriert. Ein Rollback auf einen anderen Namen (außer einem gültigen Speicherpunktnamen) generiert einen Fehler, ohne dass eine der Anweisungen zurückgespielt wird. 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 heraufgestuft, 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 Datenbankmodulinstanz 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 diese Eigenschaft auf <a0/> festgelegt ist, erstellt eine Anweisung eine äußere und eine innere Transaktion, die auf 2 festgelegt ist. Weitere Informationen finden Sie unter SET IMPLICIT_TRANSACTIONS.

Hinweis

Das Datenbankmodul unterstützt keine unabhängig verwaltbaren geschachtelten Transaktionen. Ein Commit einer inneren @@TRANCOUNT Transaktion wird erhöht, hat jedoch keine anderen Auswirkungen. Ein Rollback einer inneren Transaktion führt immer einen Rollback der äußeren Transaktion durch, es sei denn, ein Speicherpunkt ist vorhanden und wird in der ROLLBACK Anweisung angegeben.

Markierte Transaktionen

Die WITH MARK Option bewirkt, dass der Transaktionsname im Transaktionsprotokoll aufgezeichnet wird. Wenn Sie eine Datenbank in einem früheren Zustand wiederherstellen, kann die markierte Transaktion verwendet werden, um den Wiederherstellungspunkt anstelle eines Datums und einer Uhrzeit anzugeben. Weitere Informationen finden Sie unter Verwendung von markierten Transaktionen zum Wiederherstellen verwandter Datenbanken konsistent und RESTORE-Anweisungen.

Darüber hinaus sind Transaktionsprotokollmarkierungen erforderlich, wenn Sie eine Reihe verwandter Datenbanken in einen bestimmten freigegebenen Konsistenzstatus wiederherstellen müssen. Eine Anwendung, die den Konsistenzstatus jeder Datenbank kennt, kann Mithilfe einer datenbankübergreifenden oder verteilten Transaktion Markierungen in den Transaktionsprotokollen der zugehörigen Datenbanken platzieren. Durch das Wiederherstellen der Gruppe verwandter Datenbanken zu diesen Markierungen wird eine Reihe von Datenbanken mit einem bekannten freigegebenen Konsistenzstatus erzielt.

Die Markierung wird nur dann im Transaktionsprotokoll abgelegt, wenn die Datenbank durch die markierte Transaktion aktualisiert wird. Transaktionen, die keine Daten ändern, werden nicht im Protokoll aufgezeichnet.

BEGIN TRANSACTION <new_name> WITH MARK kann beim Starten einer inneren Transaktion verwendet werden. In diesem Fall wird der Markenname für die Transaktion, <new_name> wenn die äußere Transaktion nicht markiert ist. Im folgenden konzeptionellen Beispiel M2 ist der Name des Zeichens angegeben.

BEGIN TRAN T1;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK;

UPDATE table2 ...;

SELECT column1 FROM table1;

COMMIT TRAN M2;

UPDATE table3 ...;

COMMIT TRAN T1;

Wenn Sie eine innere Transaktion markieren, 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.

Permissions

Erfordert die Mitgliedschaft in der Rolle public.

Examples

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage 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 Managed Instance, SQL-Datenbank in Microsoft Fabric, Azure Synapse Analytics, Analytics Platform System (PDW)

BEGIN TRANSACTION;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION;

B. Zurücksetzen einer Transaktion

Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric, 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 Managed Instance, SQL-Datenbank in Microsoft Fabric

Im folgenden Beispiel wird gezeigt, wie eine Transaktion benannt wird.

DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;

D. Markieren einer Transaktion

Gilt für: SQL Server 2008 (10.0.x) und höhere Versionen, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric

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';

DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;

COMMIT TRANSACTION CandidateDelete;