BEGIN TRANSACTION (Transact-SQL)BEGIN TRANSACTION (Transact-SQL)

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data WarehouseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

Markiert den Anfang einer expliziten lokalen Transaktion.Marks the starting point of an explicit, local transaction. Explizite Transaktionen beginnen mit der BEGIN TRANSACTION-Anweisung und enden mit der COMMIT- oder ROLLBACK-Anweisung.Explicit transactions start with the BEGIN TRANSACTION statement and end with the COMMIT or ROLLBACK statement.

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Azure Synapse Analytics and Parallel Data Warehouse
 
BEGIN { TRAN | TRANSACTION }   
[ ; ]  

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumenteArguments

transaction_nametransaction_name
GILT FÜR: SQL Server (ab 2008), Azure SQL-DatenbankAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Der Name, der der Transaktion zugewiesen ist.Is the name assigned to the transaction. transaction_name muss den Regeln für Bezeichner entsprechen. Bezeichner mit mehr als 32 Zeichen sind jedoch nicht zulässig.transaction_name must conform to the rules for identifiers, but identifiers longer than 32 characters are not allowed. Verwenden Sie Transaktionsnamen nur beim äußersten Paar von geschachtelten BEGIN...COMMIT- bzw. BEGIN...ROLLBACK-Anweisungen.Use transaction names only on the outermost pair of nested BEGIN...COMMIT or BEGIN...ROLLBACK statements. transaction_name berücksichtigt immer die Groß-/Kleinschreibung, auch wenn die Instanz von SQL ServerSQL Server nicht zwischen Groß- und Kleinschreibung unterscheidet.transaction_name is always case sensitive, even when the instance of SQL ServerSQL Server is not case sensitive.

@tran_name_variable@tran_name_variable
GILT FÜR: SQL Server (ab 2008), Azure SQL-DatenbankAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Ist der Name einer benutzerdefinierten Variablen, die einen gültigen Transaktionsnamen enthält.Is the name of a user-defined variable containing a valid transaction name. Die Variable muss mit einem der folgenden Datentypen deklariert werden: char, varchar, nchar oder nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type. Werden mehr als 32 Zeichen an die Variable übergeben, werden nur die ersten 32 Zeichen verwendet; alle übrigen Zeichen werden abgeschnitten.If more than 32 characters are passed to the variable, only the first 32 characters will be used; the remaining characters will be truncated.

WITH MARK [ 'Beschreibung' ]WITH MARK [ 'description' ]
GILT FÜR: SQL Server (ab 2008), Azure SQL-DatenbankAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Gibt an, dass die Transaktion im Protokoll markiert wird.Specifies that the transaction is marked in the log. Eine Beschreibung ist eine Zeichenfolge, die die Markierung beschreibt.description is a string that describes the mark. 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.A description longer than 128 characters is truncated to 128 characters before being stored in the msdb.dbo.logmarkhistory table.

Wenn WITH MARK verwendet wird, muss ein Transaktionsname angegeben sein.If WITH MARK is used, a transaction name must be specified. WITH MARK ermöglicht es, ein Transaktionsprotokoll bis zu einer benannten Markierung wiederherzustellen.WITH MARK allows for restoring a transaction log to a named mark.

Allgemeine HinweiseGeneral Remarks

BEGIN TRANSACTION erhöht @@TRANCOUNT um den Wert 1.BEGIN TRANSACTION increments @@TRANCOUNT by 1.

BEGIN TRANSACTION stellt einen Punkt dar, an dem die Daten, auf die eine Verbindung verweist, logisch und physisch konsistent sind.BEGIN TRANSACTION represents a point at which the data referenced by a connection is logically and physically consistent. 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.If errors are encountered, all data modifications made after the BEGIN TRANSACTION can be rolled back to return the data to this known state of consistency. 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.Each transaction lasts until either it completes without errors and COMMIT TRANSACTION is issued to make the modifications a permanent part of the database, or errors are encountered and all modifications are erased with a ROLLBACK TRANSACTION statement.

Mit BEGIN TRANSACTION wird eine lokale Transaktion für die Verbindung gestartet, die die Anweisung ausgibt.BEGIN TRANSACTION starts a local transaction for the connection issuing the statement. Abhängig von den aktuellen Einstellungen der Transaktionsisolationsstufe werden viele Ressourcen, die zur Unterstützung der von der Verbindung ausgegebenen Transact-SQLTransact-SQL-Anweisungen abgerufen werden, so lange von der Transaktion gesperrt, bis diese entweder mit einer COMMIT TRANSACTION- oder einer ROLLBACK TRANSACTION-Anweisung abgeschlossen wurde.Depending on the current transaction isolation level settings, many resources acquired to support the Transact-SQLTransact-SQL statements issued by the connection are locked by the transaction until it is completed with either a COMMIT TRANSACTION or ROLLBACK TRANSACTION statement. Längere Zeit ausstehende Transaktionen können verhindern, dass andere Anwender auf diese gesperrten Ressourcen zugreifen und dass Protokolle abgeschnitten werden.Transactions left outstanding for long periods of time can prevent other users from accessing these locked resources, and also can prevent log truncation.

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.Although BEGIN TRANSACTION starts a local transaction, it is not recorded in the transaction log until the application subsequently performs an action that must be recorded in the log, such as executing an INSERT, UPDATE, or DELETE statement. 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.An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements, but nothing is recorded in the log until the application performs a modification action.

Das Benennen mehrerer Transaktionen in einer Reihe von geschachtelten Transaktionen mit einem Transaktionsnamen hat kaum Auswirkungen auf die Transaktion.Naming multiple transactions in a series of nested transactions with a transaction name has little effect on the transaction. Nur der erste (äußerste) Transaktionsname wird im System registriert.Only the first (outermost) transaction name is registered with the system. Ein Rollback zu einem anderen Namen (der kein gültiger Sicherungspunktname ist) erzeugt einen Fehler.A rollback to any other name (other than a valid savepoint name) generates an error. Für keine der Anweisungen, die vor dem Rollback ausgeführt werden, wird zum Zeitpunkt des Auftretens dieses Fehlers ein Rollback ausgeführt.None of the statements executed before the rollback is, in fact, rolled back at the time this error occurs. Für die Anweisungen wird erst dann ein Rollback ausgeführt, wenn für die äußere Transaktion ein Rollback ausgeführt wird.The statements are rolled back only when the outer transaction is rolled back.

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:The local transaction started by the BEGIN TRANSACTION statement is escalated to a distributed transaction if the following actions are performed before the statement is committed or rolled back:

  • Es wird eine INSERT-, DELETE- oder UPDATE-Anweisung ausgeführt, die auf eine Remotetabelle auf einem Verbindungsserver verweist.An INSERT, DELETE, or UPDATE statement that references a remote table on a linked server is executed. 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.The INSERT, UPDATE, or DELETE statement fails if the OLE DB provider used to access the linked server does not support the ITransactionJoin interface.

  • Eine remote gespeicherte Prozedur wird aufgerufen, wenn die Option REMOTE_PROC_TRANSACTIONS auf ON festgelegt ist.A call is made to a remote stored procedure when the REMOTE_PROC_TRANSACTIONS option is set to ON.

Die lokale Kopie von SQL ServerSQL Server wird zum Transaktionscontroller und verwendet MicrosoftMicrosoft Distributed Transaction Coordinator (MS DTC), um die verteilte Transaktion zu verwalten.The local copy of SQL ServerSQL Server becomes the transaction controller and uses MicrosoftMicrosoft Distributed Transaction Coordinator (MS DTC) to manage the distributed transaction.

Eine Transaktion kann mithilfe von BEGIN DISTRIBUTED TRANSACTION explizit als verteilte Transaktion ausgeführt werden.A transaction can be explicitly executed as a distributed transaction by using BEGIN DISTRIBUTED TRANSACTION. Weitere Informationen finden Sie unter BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).For more information, see BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Wenn SET IMPLICIT_TRANSACTIONS auf ON festgelegt ist, werden durch eine BEGIN TRANSACTION-Anweisung zwei geschachtelte Transaktionen erstellt.When SET IMPLICIT_TRANSACTIONS is set to ON, a BEGIN TRANSACTION statement creates two nested transactions. Weitere Informationen finden Sie unter SET IMPLICIT_TRANSACTIONS (Transact-SQL).For more information see, SET IMPLICIT_TRANSACTIONS (Transact-SQL)

Markierte TransaktionenMarked Transactions

Die Option WITH MARK bewirkt, dass der Transaktionsname im Transaktionsprotokoll abgelegt wird.The WITH MARK option causes the transaction name to be placed in the transaction log. Wenn eine Datenbank in einem früheren Status wiederhergestellt wird, kann die markierte Transaktion statt eines Datums und einer Uhrzeit verwendet werden.When restoring a database to an earlier state, the marked transaction can be used in place of a date and time. Weitere Informationen finden Sie unter Wiederherstellen von verwandten Datenbanken mithilfe von markierten Transaktionen (vollständiges Wiederherstellungsmodell) und RESTORE (Transact-SQL).For more information, see Use Marked Transactions to Recover Related Databases Consistently (Full Recovery Model) and RESTORE (Transact-SQL).

Transaktionsprotokollmarkierungen sind außerdem erforderlich, wenn Sie eine Gruppe von zusammenhängenden Datenbanken in einem logisch konsistenten Status wiederherstellen müssen.Additionally, transaction log marks are necessary if you need to recover a set of related databases to a logically consistent state. Markierungen können von einer verteilten Transaktion in den Transaktionsprotokollen der zusammenhängenden Datenbanken abgelegt werden.Marks can be placed in the transaction logs of the related databases by a distributed transaction. Das Wiederherstellen der Gruppe von zusammenhängenden Datenbanken entsprechend diesen Markierungen ergibt eine Gruppe von Datenbanken, die hinsichtlich der Transaktionen konsistent sind.Recovering the set of related databases to these marks results in a set of databases that are transactionally consistent. Das Ablegen von Markierungen in zusammenhängenden Datenbanken erfordert spezielle Prozeduren.Placement of marks in related databases requires special procedures.

Die Markierung wird nur dann im Transaktionsprotokoll abgelegt, wenn die Datenbank durch die markierte Transaktion aktualisiert wird.The mark is placed in the transaction log only if the database is updated by the marked transaction. Transaktionen, die keine Daten ändern, werden nicht markiert.Transactions that do not modify data are not marked.

BEGIN TRAN new_name WITH MARK kann innerhalb einer vorhandenen Transaktion, die nicht markiert ist, geschachtelt werden.BEGIN TRAN new_name WITH MARK can be nested within an already existing transaction that is not marked. 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.Upon doing so, new_name becomes the mark name for the transaction, despite the name that the transaction may already have been given. Im folgenden Beispiel ist M2 der Name der Markierung.In the following example, M2 is the name of the mark.

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):When nesting transactions, trying to mark a transaction that is already marked results in a warning (not error) message:

"BEGIN TRAN T1 WITH MARK ...;""BEGIN TRAN T1 WITH MARK ...;"

"UPDATE table1 ...;""UPDATE table1 ...;"

"BEGIN TRAN M2 WITH MARK ...;""BEGIN TRAN M2 WITH MARK ...;"

"Server: Meldung 3920, Ebene 16, Status 1, Zeile 3""Server: Msg 3920, Level 16, State 1, Line 3"

"Die Option WITH MARK gilt nur für die erste BEGIN TRAN WITH MARK-Anweisung.""WITH MARK option only applies to the first BEGIN TRAN WITH MARK."

"Die Option wird ignoriert.""The option is ignored."

BerechtigungenPermissions

Erfordert die Mitgliedschaft in der public-Rolle.Requires membership in the public role.

BeispieleExamples

A.A. Verwenden expliziter TransaktionenUsing an explicit transaction

GILT FÜR: SQL Server (ab 2008), Azure SQL-Datenbank, Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse), Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse), Parallel Data Warehouse

In diesem Beispiel wird AdventureWorks verwendet.This example uses AdventureWorks.

BEGIN TRANSACTION;  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
COMMIT;  

B.B. Ausführen eines Rollbacks für eine TransaktionRolling back a transaction

GILT FÜR: SQL Server (ab 2008), Azure SQL-Datenbank, Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse), Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure Synapse Analytics (SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse), Parallel Data Warehouse

Im folgenden Beispiel werden die Auswirkungen des Rollbacks einer Transaktion veranschaulicht.The following example shows the effect of rolling back a transaction. In diesem Beispiel führt die ROLLBACK-Anweisung ein Rollback der INSERT-Anweisung aus, die erstellte Tabelle bleibt jedoch weiterhin vorhanden.In this example, the ROLLBACK statement will roll back the INSERT statement, but the created table will still exist.

CREATE TABLE ValueTable (id INT);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;  

C.C. Benennen einer TransaktionNaming a transaction

GILT FÜR: SQL Server (ab 2008), Azure SQL-DatenbankAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Im folgenden Beispiel wird gezeigt, wie eine Transaktion benannt wird.The following example shows how to name a transaction.

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  
  
BEGIN TRANSACTION @TranName;  
USE AdventureWorks2012;  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
  
COMMIT TRANSACTION @TranName;  
GO  

D:D. Markieren einer TransaktionMarking a transaction

GILT FÜR: SQL Server (ab 2008), Azure SQL-DatenbankAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Im folgenden Beispiel wird gezeigt, wie eine Transaktion markiert wird.The following example shows how to mark a transaction. Die Transaktion CandidateDelete wird markiert.The transaction CandidateDelete is marked.

BEGIN TRANSACTION CandidateDelete  
    WITH MARK N'Deleting a Job Candidate';  
GO  
USE AdventureWorks2012;  
GO  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
GO  
COMMIT TRANSACTION CandidateDelete;  
GO  

Weitere InformationenSee Also

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