Signatur
Beschreibung
mysqli_rollback() bricht die aktuelle Transaktion ab und macht alle seit dem letzten mysqli_begin_transaction() bzw. mysqli_commit() durchgeführten Änderungen rückgängig. Die Funktion ist essenziell für das Fehlerhandling bei mehrstufigen Datenbankoperationen, bei denen ein partieller Fehler den gesamten Vorgang ungültig machen soll.
Transaktionen sind nur dann sinnvoll, wenn der Autocommit-Modus deaktiviert ist. Mit mysqli_autocommit($mysql, false) oder über mysqli_begin_transaction() wird der Autocommit-Modus implizit abgeschaltet. Nach einem mysqli_rollback() bleibt der Autocommit-Status unverändert, sodass die Verbindung weiterhin bereit ist, eine neue Transaktion zu starten.
Der optionale Parameter $flags ermöglicht es, das Verhalten nach dem Rollback zu steuern (z. B. Kette starten oder beenden). Der Parameter $name erlaubt das Rollback bis zu einem Savepoint, der zuvor mit SAVEPOINT name gesetzt wurde. Savepoints sind nützlich, um innerhalb einer Transaktion nur einen Teilbereich rückgängig zu machen.
Die Funktion steht sowohl als prozedurale Funktion (mysqli_rollback()) als auch als objektorientierte Methode ($mysqli->rollback()) zur Verfügung. Bei fehlerfreier Ausführung gibt sie true zurück, im Fehlerfall false.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive MySQL-Verbindung, die durch mysqli_connect() oder mysqli_init() erzeugt wurde. |
|
| $flags | int | 0 | Optionale Steuerflaggen. Mögliche Werte sind MYSQLI_TRANS_COR_AND_CHAIN (neue Transaktion starten), MYSQLI_TRANS_COR_AND_NO_CHAIN (keine neue Transaktion), MYSQLI_TRANS_COR_RELEASE (Verbindung nach Commit freigeben) oder MYSQLI_TRANS_COR_NO_RELEASE. |
| $name | ?string | null | Name eines Savepoints, bis zu dem zurückgerollt werden soll. Wurde kein Savepoint mit diesem Namen angelegt, schlägt die Funktion fehl. Bei null wird die gesamte aktuelle Transaktion zurückgerollt. |
Rückgabewert
true zurück, wenn das Rollback erfolgreich durchgeführt wurde, andernfalls false. Ein Fehlschlag tritt z. B. auf, wenn keine aktive Transaktion vorhanden ist oder ein ungültiger Savepoint-Name angegeben wurde.Beispiele
Transaktion mit Fehlerbehandlung und Rollback
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'shop');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$mysqli->autocommit(false);
try {
$mysqli->query("UPDATE konten SET guthaben = guthaben - 100 WHERE id = 1");
if ($mysqli->affected_rows !== 1) {
throw new RuntimeException('Konto 1 nicht gefunden.');
}
$mysqli->query("UPDATE konten SET guthaben = guthaben + 100 WHERE id = 2");
if ($mysqli->affected_rows !== 1) {
throw new RuntimeException('Konto 2 nicht gefunden.');
}
$mysqli->commit();
echo 'Überweisung erfolgreich.';
} catch (RuntimeException $e) {
$mysqli->rollback();
echo 'Fehler – Transaktion zurückgerollt: ' . $e->getMessage();
}
$mysqli->close();
Rollback bis zu einem Savepoint
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'shop');
$mysqli->autocommit(false);
// Erste Änderung
$mysqli->query("INSERT INTO bestellungen (produkt_id, menge) VALUES (5, 2)");
// Savepoint setzen
$mysqli->query("SAVEPOINT nach_bestellung");
// Zweite Änderung – soll rückgängig gemacht werden
$mysqli->query("UPDATE lager SET menge = menge - 2 WHERE produkt_id = 5");
// Nur die Lageraktualisierung zurückrollen
$mysqli->rollback(0, 'nach_bestellung');
// Bestellung bleibt bestehen, Commit nur für die Bestellung
$mysqli->commit();
echo 'Bestellung gespeichert, Lagerupdate zurückgerollt.';
$mysqli->close();
// Wichtig · Fallstricke
Wichtig: mysqli_rollback() funktioniert nur mit transaktionssicheren Speicher-Engines wie InnoDB. Bei MyISAM-Tabellen haben Transaktionen keine Wirkung – Änderungen werden sofort permanent gespeichert, und ein Rollback hat keinen Effekt.
Stellt sicher, dass der Autocommit-Modus tatsächlich deaktiviert ist, bevor ihr eine Transaktion startet. Wird mysqli_autocommit($mysql, true) aufgerufen, werden alle offenen Änderungen implizit committed, und ein anschließendes Rollback ist wirkungslos.
Bei Verwendung von Savepoints muss beachtet werden, dass nach einem ROLLBACK TO SAVEPOINT der Savepoint selbst weiterhin existiert. Er kann mit RELEASE SAVEPOINT name explizit gelöscht werden.