START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
Die Anweisungen START TRANSACTION und
BEGIN starten eine neue Transaktion.
COMMIT übergibt die aktuelle Transaktion,
macht also die entsprechenden Änderungen permanent. Mit
ROLLBACK machen Sie die laufende Transaktion
rückgängig, d. h., alle Änderungen werden zurückgenommen.
Die Anweisung SET AUTOCOMMIT schließlich
aktiviert oder deaktiviert den standardmäßigen
Autocommit-Modus für die aktuelle Verbindung.
Das optionale Schlüsselwort WORK wird für
COMMIT und RELEASE
unterstützt, ebenso die CHAIN- und
RELEASE-Klauseln. CHAIN
und RELEASE können verwendet werden, um den
Transaktionsabschluss besser steuern zu können. Der Wert der
Systemvariablen completion_type bestimmt das
Standardverhalten beim Transaktionsabschluss. Siehe auch
Abschnitt 5.2.2, „Server-Systemvariablen“.
Die AND CHAIN-Klausel bewirkt, dass eine neue
Transaktion beginnt, sobald die aktuelle endet. Die neue
Transaktion hat dabei dieselbe Isolierungsstufe wie die zuvor
beendete Transaktion. Die RELEASE-Klausel
bewirkt, dass der Server die aktuelle Clientverbindung nach
Abschluss der aktuellen Transaktion beendet. Das Schlüsselwort
NO unterdrückt den Abschluss von
CHAIN oder RELEASE. Dies
kann nützlich sein, wenn aufgrund der Einstellung der
Systemvariablen completion_type der Abschluss
von CHAIN oder RELEASE
standardmäßig erzwungen wird.
Standardmäßig läuft MySQL im Autocommit-Modus. Das bedeutet, dass, sobald eine Anweisung ausgeführt wird, die eine Tabelle aktualisiert (also ändert), MySQL diese Änderung auf Festplatte speichert.
Verwenden Sie eine transaktionssichere Speicher-Engine (wie
InnoDB, BDB oder
NDB Cluster), dann können Sie den
Autocommit-Modus mit der folgenden Anweisung deaktivieren:
SET AUTOCOMMIT=0;
Nach der Deaktivierung des Autocommit-Modus durch Setzen der
AUTOCOMMIT-Variablen auf Null müssen Sie
Ihre Änderungen mit COMMIT auf Festplatte
speichern oder mit ROLLBACK rückgängig
machen, wenn Sie die seit Beginn der Transaktion vorgenommenen
Änderungen nicht übernehmen wollen.
Um den Autocommit-Modus für eine einzelne Abfolge von
Anweisungen zu deaktivieren, verwenden Sie die Anweisung
START TRANSACTION:
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
Bei START TRANSACTION bleibt Autocommit
deaktiviert, bis Sie die Transaktion mit
COMMIT oder ROLLBACK
beenden. Der Autocommit-Modus kehrt dann in seinen vorherigen
Status zurück.
BEGIN und BEGIN WORK
werden als Aliase für START TRANSACTION
benutzt, um eine Transaktion zu starten. START
TRANSACTION ist die SQL-Standardsyntax und wird als
Möglichkeit zur Durchführung spontaner Transaktionen
empfohlen.
Die BEGIN-Anweisung unterscheidet sich von
der Verwendung des Schlüsselworts BEGIN,
welches eine mehrteilige BEGIN ...
END-Anweisung einleitet. Mit Letzterem wird keine
Transaktion begonnen. Siehe auch Abschnitt 19.2.5, „BEGIN ... END-Syntax für komplexe Anweisungen“.
Sie können eine Transaktion auch wie folgt einleiten:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
Die Klausel WITH CONSISTENT SNAPSHOT startet
eine konsistente Leseoperation für Speicher-Engines, die diese
unterstützen. Derzeit betrifft dies nur
InnoDB. Der Effekt ist derselbe wie beim
Absetzen einer START TRANSACTION-Anweisung
gefolgt von einer SELECT-Anweisung für eine
beliebige InnoDB-Tabelle. Siehe auch
Abschnitt 14.2.10.4, „Konsistentes Lesen“.
Die Klausel WITH CONSISTENT SNAPSHOT ändert
die aktuelle Isolationsstufe der Transaktion nicht, d. h., eine
konsistente Momentaufnahme wird nur dann erstellt, wenn die
aktuelle Isolationsstufe konsistente Leseoperationen gestattet
(REPEATABLE READ oder
SERIALIZABLE).
Bei Beginn einer Transaktion wird implizit UNLOCK
TABLES ausgeführt.
Beste Ergebnisse erhalten Sie, wenn Sie Transaktionen nur bei Tabellen durchführen, die mit einer einzelnen transaktionssicheren Speicher-Engine verwaltet werden. Andernfalls können die folgenden Probleme auftreten:
Wenn Ihre Tabellen mehrere transaktionssichere
Speicher-Engines verwenden (z. B. InnoDB
und BDB) und die Isolationsstufe nicht
SERIALIZABLE ist, besteht die
Möglichkeit, dass, wenn eine Transaktion übergeben wird,
eine andere laufende Transaktion, die dieselben Tabellen
benutzt, nur einen Teil der durch die erste Transaktion
vorgenommenen Änderungen erkennt. Die Atomizität der
Transaktionen ist mithin bei Verwendung mehrerer Engines
nicht gewährleistet, und es können Inkonsistenzen
auftreten. (Wenn Transaktionen mehrerer Engines nicht
häufig vorkommen, können Sie die Isolationsstufe mit
SET TRANSACTION ISOLATION LEVEL für eine
Transaktion nach Bedarf auf SERIALIZABLE
setzen.)
Verwenden Sie in einer Transaktion nichttransaktionssichere Tabellen, dann werden alle Änderungen an diesen Tabellen unabhängig vom Status des Autocommit-Modus sofort gespeichert.
Wenn Sie nach Aktualisierung einer nichttransaktionssicheren
Tabelle in einer Transaktion eine
ROLLBACK-Anweisung absetzen, erscheint
die Warnung
ER_WARNING_NOT_COMPLETE_ROLLBACK.
Änderungen an transaktionssicheren Tabellen werden in
diesem Fall rückgängig gemacht, nicht jedoch Änderungen
an nichttransaktionssicheren Tabellen.
Jede Transaktion wird nach Absetzen von
COMMIT am Stück in das Binärlog
geschrieben. Transaktionen, die per Rollback rückgängig
gemacht wurden, werden nicht geloggt.
(Ausnahme: Für Modifikationen
an nicht transaktionssicheren Tabellen kann kein Rollback
durchgeführt werden. Wenn eine Transaktion, für die ein
Rollback erfolgt, Änderungen an nicht transaktionssicheren
Tabellen enthält, dann wird die gesamte Transaktion am Ende mit
einer ROLLBACK-Anweisung geloggt, um
sicherzustellen, dass die Modifikationen an diesen Tabellen
repliziert werden.) Siehe auch Abschnitt 5.12.3, „Die binäre Update-Logdatei“.
Sie können die Isolationsstufe für Transaktionen mit
SET TRANSACTION ISOLATION LEVEL ändern.
Siehe auch Abschnitt 13.4.6, „SET TRANSACTION“.
Ein Rollback kann ein relativ langsamer Vorgang sein, der zudem
stattfinden kann, ohne dass der Benutzer dies explizit
angefordert hat (z. B. wenn ein Fehler aufgetreten ist).
Aufgrund dieser Tatsache zeigt SHOW
PROCESSLIST in der Spalte State
für die Verbindung Rolling back an, solange
implizite oder (durch die SQL-Anweisung
ROLLBACK) explizite Rollbacks durchgeführt
werden.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.
