BEGIN TRANSACTION (Transact-SQL)
Markiert den Anfang einer expliziten lokalen Transaktion. BEGIN TRANSACTION erhöht @@TRANCOUNT um 1.
Syntax
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Argumente
transaction_name
Der Name, der der Transaktion zugewiesen wird. transaction_name muss den Regeln für Bezeichner entsprechen, wobei jedoch Bezeichner mit mehr als 32 Zeichen nicht zulässig sind. Verwenden Sie Transaktionsnamen nur beim äußersten Paar von geschachtelten BEGIN...COMMIT- bzw. BEGIN...ROLLBACK-Anweisungen.@tran_name_variable
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 [ 'description' ]
Gibt an, dass die Transaktion im Protokoll markiert wird. description ist eine Zeichenfolge, die die Markierung beschreibt. Ein description-Wert, der länger als 128 Zeichen ist, wird auf 128 Zeichen gekürzt, bevor er in der msdb.dbo.logmarkhistory-Tabelle 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.
Hinweise
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).
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 Verwenden markierter Transaktionen (vollständiges Wiederherstellungsmodell) und unter 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. Benennen einer Transaktion
Im folgenden Beispiel wird gezeigt, wie eine Transaktion benannt wird.
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
USE AdventureWorks2008R2;
DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
GO
B. Markieren einer Transaktion
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 AdventureWorks2008R2;
GO
DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate
WHERE JobCandidateID = 13;
GO
COMMIT TRANSACTION CandidateDelete;
GO