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.