W3docs

rollback

MySQLi ist eine PHP-Erweiterung zur MySQL-Datenbankinteraktion. Die Funktion rollback() macht alle Änderungen einer Transaktion rückgängig.

Einführung

MySQLi ist die PHP-Erweiterung, mit der MySQL-Datenbanken angesprochen werden. Die Funktion mysqli_rollback() (bzw. die Methode $mysqli->rollback() im objektorientierten Stil) macht alle Änderungen rückgängig, die seit dem Beginn einer Transaktion vorgenommen wurden. Diese Seite erklärt, wann und warum sie benötigt wird, wie sie im Zusammenspiel mit mysqli_commit() funktioniert, und zeigt ausführbare Beispiele sowohl im prozeduralen als auch im objektorientierten Stil.

Wer mit der Erweiterung noch nicht vertraut ist, sollte mit PHP MySQLi und dem Verbindungsaufbau zu MySQL beginnen.

Was ist die MySQLi-Rollback-Funktion?

Eine Transaktion ist eine Gruppe von Datenbankoperationen, die als eine Arbeitseinheit behandelt wird: Entweder werden alle angewendet oder keine davon. mysqli_rollback() ermöglicht das „keine davon" — sie verwirft alle Änderungen seit dem Start der Transaktion und versetzt die Datenbank in ihren vorherigen Zustand zurück.

Das klassische Beispiel ist eine Geldüberweisung. Der Abzug von einem Konto und die Gutschrift auf einem anderen müssen beide erfolgen; schlägt die zweite Abfrage fehl, darf die erste nicht bestehen bleiben. Der Rollback stellt sicher, dass die Buchhaltung ausgeglichen bleibt.

bool mysqli_rollback(mysqli $mysql, int $flags = 0, ?string $name = null)

Die Funktion gibt bei Erfolg true und bei Fehler false zurück. Das optionale $name-Argument erlaubt den Rollback zu einem benannten Savepoint statt zur gesamten Transaktion.

Autocommit: Warum Transaktionen überhaupt nötig sind

Standardmäßig läuft MySQL im Autocommit-Modus, d. h. jede einzelne Anweisung wird sofort und dauerhaft übernommen — es gibt nichts zurückzurollen. Durch den Aufruf von mysqli_begin_transaction() wird Autocommit für die Dauer der Transaktion deaktiviert, sodass Änderungen ausstehend bleiben, bis explizit commit() oder rollback() aufgerufen wird. Das vollständige Verhalten ist unter autocommit beschrieben.

Wie der Rollback-Ablauf funktioniert

Eine vollständige Transaktion umfasst vier Schritte:

  1. Verbinden mit dem Server.
  2. Starten einer Transaktion mit mysqli_begin_transaction().
  3. Ausführen der Abfragen.
  4. Committen, wenn alles erfolgreich war, oder Rollback, wenn etwas fehlgeschlagen ist.

Hier ist ein vollständiges prozedurales Beispiel:

<?php
// Create a connection to the MySQL server
$conn = mysqli_connect("localhost", "username", "password", "database");

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// Start a transaction
mysqli_begin_transaction($conn);

// Execute queries and make changes to the database
$insert = mysqli_query($conn, "INSERT INTO `my_table` (column1, column2) VALUES ('value1', 'value2')");
$update = mysqli_query($conn, "UPDATE `my_table` SET column1 = 'new_value' WHERE id = 1");

// Check if queries succeeded
if ($insert && $update) {
    // Commit the transaction if all queries succeed
    mysqli_commit($conn);
    echo "Transaction committed successfully.";
} else {
    // Rollback the changes if any query fails
    mysqli_rollback($conn);
    echo "Transaction failed and rolled back: " . mysqli_error($conn);
}

mysqli_close($conn);
?>

Eine Transaktion wird gestartet, zwei Abfragen werden ausgeführt, und das Ergebnis bestimmt den weiteren Verlauf: Commit bei Erfolg, Rollback bei Fehler. Zu beachten ist, dass mysqli_query() nur false zurückgibt, wenn eine Abfrage auf SQL-Ebene fehlschlägt — es wird keine Ausnahme geworfen, daher muss der Rückgabewert manuell geprüft werden, sofern keine Ausnahmen aktiviert sind (siehe unten).

Objektorientierter Stil mit Prepared Statements

In der Produktion wird meist die objektorientierte API zusammen mit Prepared Statements eingesetzt, die SQL-Injection verhindern, indem Abfrage und Daten voneinander getrennt werden. Das Aktivieren des Exception-Report-Modus ermöglicht es, die gesamte Transaktion in einem einzigen try/catch-Block zu kapseln und den Rollback an einer Stelle durchzuführen:

<?php
// Throw exceptions on any MySQLi error instead of returning false
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli("localhost", "username", "password", "database");

$mysqli->begin_transaction();

try {
    $stmt = $mysqli->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
    $stmt->bind_param("di", $amount, $fromId);
    $amount = 100.00;
    $fromId = 1;
    $stmt->execute();

    $stmt = $mysqli->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
    $stmt->bind_param("di", $amount, $toId);
    $toId = 2;
    $stmt->execute();

    // Both updates succeeded — make them permanent
    $mysqli->commit();
    echo "Transfer committed.";
} catch (mysqli_sql_exception $e) {
    // Anything threw — undo everything
    $mysqli->rollback();
    echo "Transfer failed and rolled back: " . $e->getMessage();
}

$mysqli->close();
?>

Da MYSQLI_REPORT_STRICT fehlgeschlagene Anweisungen als mysqli_sql_exception auslöst, muss der Rückgabewert jeder Abfrage nicht einzeln geprüft werden — der catch-Block übernimmt jeden Fehlerpfad. Mehr zu try/catch findet sich unter PHP-Ausnahmen.

Rollback zu einem Savepoint

Ein Savepoint ist ein benannter Marker innerhalb einer Transaktion. Ein Rollback dazu macht nur die Arbeit rückgängig, die nach dem Savepoint erledigt wurde, während frühere Änderungen ausstehend bleiben. Das ist nützlich, wenn ein Teil einer Transaktion optional ist:

<?php
$mysqli->begin_transaction();

$mysqli->query("INSERT INTO orders (customer_id) VALUES (5)");
$mysqli->savepoint("after_order");

$mysqli->query("INSERT INTO order_items (order_id, sku) VALUES (LAST_INSERT_ID(), 'BAD')");

// Undo only the order_items insert; the order row remains pending
$mysqli->rollback(0, "after_order");

$mysqli->commit(); // commits the order without the bad item
?>

Anwendungsfälle der MySQLi-Rollback-Funktion

Die MySQLi-Rollback-Funktion ist für verschiedene Szenarien nützlich:

1. Datenintegrität

Bewahrt die Konsistenz der Datenbank, indem partielle Aktualisierungen beim Fehlschlagen einer Operation rückgängig gemacht werden und Datensätze gültig bleiben.

2. Fehlerbehandlung

Bietet einen sauberen Wiederherstellungsmechanismus. Tritt ein Fehler auf, verhindert der Rollback verwaiste oder beschädigte Daten und erlaubt der Anwendung, aussagekräftige Fehlermeldungen zu protokollieren und anzuzeigen.

3. Transaktionsverwaltung

Vereinfacht die Ablaufsteuerung, indem Entwickler eine Abfolge abhängiger Operationen abbrechen und die Transaktion sicher neu starten oder aufgeben können, ohne manuelle Bereinigung.

Vorteile der MySQLi-Rollback-Funktion

Die MySQLi-Rollback-Funktion bietet PHP-Entwicklern mehrere technische Vorteile:

1. Atomarität

Sie garantiert, dass eine Gruppe von Datenbankoperationen entweder vollständig erfolgreich ist oder vollständig fehlschlägt, und verhindert so partielle Aktualisierungen, die Daten korrumpieren könnten.

2. Vereinfachtes Debugging

Schlägt eine Transaktion fehl, stellt der Rollback die Datenbank in ihren vorherigen Zustand zurück, was das Isolieren und Beheben der problematischen Abfrage ohne manuelle Bereinigung erleichtert.

3. Leistungsoptimierung

Das Bündeln mehrerer Abfragen in einer einzigen Transaktion reduziert den Overhead des individuellen Committens von Änderungen und führt zu schnelleren Datenbankoperationen.

Häufige Fallstricke

  • Die Storage-Engine ist entscheidend. Nur transaktionale Engines unterstützen Rollbacks. MySQLs Standard-Engine InnoDB tut dies; die ältere MyISAM-Engine ignoriert Transaktionen stillschweigend, ein Rollback ändert dort nichts. Sicherstellen, dass die Tabellen InnoDB verwenden.
  • DDL-Anweisungen committen automatisch. Anweisungen wie CREATE TABLE, ALTER TABLE und DROP TABLE committen die laufende Transaktion in MySQL implizit — sie können nicht zurückgerollt werden. Schemaänderungen aus Transaktionen heraushalten, die rückgängig gemacht werden sollen.
  • Rollback genau einmal. Nach einem commit() oder einem vollständigen rollback() ist die Transaktion beendet. Vor weiteren transaktionalen Operationen muss eine neue gestartet werden.
  • Verbindungsabbrüche lösen automatischen Rollback aus. Geht die Verbindung mitten in einer Transaktion verloren, rollt MySQL automatisch zurück — unbestätigte Änderungen bleiben nie halb angewendet.

Fazit

Die Funktion mysqli_rollback() ist für PHP-Entwickler unerlässlich, die Datenbankänderungen innerhalb einer Transaktion rückgängig machen müssen. Sie gewährleistet Datenintegrität, vereinfacht die Transaktionsverwaltung und verbessert die Fehlerbehandlung. Indem die in diesem Leitfaden beschriebenen Schritte befolgt werden, können Entwickler Rollbacks sicher implementieren und zuverlässige Datenbankoperationen sicherstellen.

Übungen

Übung
Was ist der Zweck der Funktion rollback() in PHP?
Was ist der Zweck der Funktion rollback() in PHP?
Was this page helpful?