Mit dieser Anweisung beginnen Sie eine benutzerdefinierte Transaktion.
BEGIN TRAN[SACTION] [ Transaktionsname ]
Der optionale Parameter Transaktionsname ist der Name, der dieser Transaktion zugeordnet wird. Er muss ein gültiger Bezeichner sein. Verwenden Sie Transaktionsnamen nur für das äußerste Paar von verschachtelten BEGIN/COMMIT- oder BEGIN/ROLLBACK-Anweisungen.
Wenn die BEGIN TRANSACTION-Anweisung innerhalb einer Transaktion ausgeführt wird, führt das zu einer Heraufsetzung der Verschachtelungsebene um eins. Die Verschachtelungsebene wird durch eine COMMIT-Anweisung heruntergesetzt. Bei verschachtelten Transaktionen werden die Änderungen an der Datenbank nur durch die äußerste COMMIT-Anweisung permanent.
Sowohl Adaptive Server Enterprise als auch SQL Anywhere bieten zwei Transaktionsmodi.
Der Standard-Transaktionsmodus von Adaptive Server Enterprise wird unverketteter Modus genannt und schreibt jede Anweisung einzeln fest, es sei denn, es wird eine explizite BEGIN TRANSACTION-Anweisung ausgeführt, um eine Transaktion zu starten. Im Gegensatz dazu schreibt der ISO SQL/2003-kompatible, verkettete Modus eine Transaktion nur fest, wenn eine explizite COMMIT-Anweisung ausgeführt wird oder wenn eine Anweisung, die ein Autocommit durchführt (wie z.B. Datendefinitionsanweisungen), ausgeführt wird.
Sie können den Modus steuern, indem Sie die Datenbankoption chained einstellen. Die Standardeinstellung für ODBC- und Embedded SQL-Verbindungen in SQL Anywhere ist ON, und SQL Anywhere läuft in diesem Fall im verketteten Modus. (ODBC-Benutzer sollten ebenfalls die ODBC-Einstellung AutoCommit überprüfen). Der Standardwert für TDS-Verbindungen ist OFF. Weitere Hinweise finden Sie unter chained-Option [Kompatibilität].
Im unverketteten Modus wird eine Transaktion implizit vor jeder Datenabfrage oder Änderungsanweisung gestartet. Diese Anweisungen sind: DELETE, INSERT, OPEN, FETCH, SELECT und UPDATE. Jede Transaktion muss jedoch explizit mit einer COMMIT- oder ROLLBACK-Anweisung abgeschlossen werden.
Die Option chained kann innerhalb einer Transaktion nicht geändert werden.
Wenn Sie eine gespeicherte Prozedur aufrufen, müssen Sie sich vergewissern, dass sie unter dem gewünschten Transaktionsmodus auch funktioniert.
Die aktuelle Verschachtelungsebene ist in der globalen Variable @@trancount enthalten. Die Variable @@trancount hat vor der Ausführung der ersten BEGIN TRANSACTION-Anweisung einen Wert von 0. Datenbankänderungen werden erst durch eine COMMIT-Anweisung dauerhaft übernommen, die ausgeführt wird, wenn @@trancount eins beträgt.
Eine ROLLBACK-Anweisung ohne den Namen einer Transaktion oder eines Savepoints setzt Anweisungen auf die äußerste (explizite oder implizite) BEGIN TRANSACTION-Anweisung zurück und bricht die gesamte Transaktion ab.
Keine.
Keine.
SQL/2003 Erweiterung des Herstellers
Der folgende Batch meldet aufeinanderfolgende Werte von @@trancount als "0", "1", "2", "1", "0". Die Werte werden im Meldungsfenster des Datenbankserver ausgegeben.
PRINT @@trancount BEGIN TRANSACTION PRINT @@trancount BEGIN TRANSACTION PRINT @@trancount COMMIT PRINT @@trancount COMMIT PRINT @@trancount |
Sie sollten die Werte von @@trancount nur heranziehen, um sich über die Anzahl der ausgegebenen, expliziten BEGIN TRANSACTION-Anweisungen auf dem Laufenden zu halten.
Wenn Adaptive Server Enterprise eine Transaktion implizit startet, wird die @@trancount-Variable auf 1 gesetzt. SQL Anywhere setzt den @@trancount-Wert nicht auf 1, wenn eine Transaktion implizit gestartet wird. Folglich hat die @@trancount-Variable in SQL Anywhere vor jeder BEGIN TRANSACTION-Anweisung einen Wert von 0 (obwohl es eine aktuelle Transaktion gibt), während sie in Adaptive Server Enterprise (im verketteten Modus) einen Wert von 1 hat.
Bei Transaktionen, die mit der Anweisung BEGIN TRANSACTION anfangen, hat @@trancount nach der ersten BEGIN TRANSACTION-Anweisung in SQL Anywhere und in Adaptive Server Enterprise einen Wert von 1. Wenn eine Transaktion implizit mit einer anderen Anweisung gestartet wird und anschließend eine BEGIN TRANSACTION-Anweisung ausgeführt wird, hat @@trancount nach der Anweisung BEGIN TRANSACTION sowohl in SQL Anywhere als auch in Adaptive Server Enterprise den Wert 2.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |