W3docs

autocommit

Erfahren Sie, wie mysqli_autocommit() in PHP funktioniert, um den Autocommit-Modus in MySQLi-Transaktionen zu aktivieren oder zu deaktivieren.

Dieser Artikel behandelt die Funktion mysqli_autocommit() in PHP, mit der der Autocommit-Modus von MySQLi aktiviert oder deaktiviert wird. Sie erfahren, was Autocommit bedeutet, welche objektorientierte und prozedurale Syntax es gibt und wie Sie es mit mysqli_commit() und mysqli_rollback() kombinieren, um sichere, alles-oder-nichts-Transaktionen durchzuführen.

Was Autocommit bedeutet

Eine Transaktion ist eine Gruppe von SQL-Anweisungen, die entweder alle erfolgreich ausgeführt werden oder alle gemeinsam fehlschlagen sollen. Standardmäßig läuft MySQLi im Autocommit-Modus: Jede einzelne Anweisung ist ihre eigene Transaktion und wird sofort in die Datenbank geschrieben (committed), sobald sie ausgeführt wird. Es gibt danach keine Möglichkeit, dies rückgängig zu machen.

mysqli_autocommit() ermöglicht es Ihnen, dieses automatische Verhalten zu deaktivieren. Sobald Autocommit deaktiviert ist, werden Ihre Anweisungen in einer ausstehenden Transaktion gehalten, bis Sie entscheiden, was damit geschehen soll:

  • Rufen Sie mysqli_commit() auf, um alle ausstehenden Änderungen dauerhaft zu speichern.
  • Rufen Sie mysqli_rollback() auf, um sie zu verwerfen und die Datenbank unverändert zu lassen.

Das ermöglicht „alles-oder-nichts"-Aktualisierungen — zum Beispiel die Überweisung von Geld zwischen zwei Konten, bei der sowohl die Belastung als auch die Gutschrift erfolgreich sein müssen oder keiner von beiden.

Verwendung der Funktion mysqli_autocommit()

Die Verwendung der Funktion mysqli_autocommit() ist sehr einfach. Sie müssen lediglich die Funktion aufrufen und eine gültige MySQLi-Verbindung sowie einen boolean-Wert übergeben, der den Autocommit-Status darstellt.

Parameter:

  • connection (prozedural) / $mysqli (OOP): Das MySQLi-Verbindungsobjekt.
  • mode (bool): TRUE zum Aktivieren von Autocommit, FALSE zum Deaktivieren.

Rückgabewert: Gibt TRUE bei Erfolg zurück, FALSE bei Fehler.

Hinweis: MySQLi unterstützt sowohl objektorientierte als auch prozedurale Syntax. Die OOP-Methode lautet $mysqli->autocommit($mode), das prozedurale Äquivalent ist mysqli_autocommit($mysqli, $mode). Beide tun exakt dasselbe – wählen Sie den Stil, den Ihre Codebasis bereits verwendet. Weitere Informationen zu den beiden Stilen finden Sie in der PHP MySQLi-Übersicht.

Hier ist ein grundlegendes Beispiel mit dem objektorientierten Stil:

Verwendung der Funktion mysqli_autocommit()

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

$mysqli->autocommit(FALSE);

$mysqli->query("INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
$mysqli->query("UPDATE users SET name='John Doe' WHERE id=1");

$mysqli->commit();

$mysqli->autocommit(TRUE);

$mysqli->close();
?>

In diesem Beispiel erstellen wir ein neues MySQLi-Objekt und deaktivieren Autocommit durch den Aufruf der Funktion autocommit() mit dem Argument FALSE. Anschließend führen wir zwei Abfragen aus, um Daten in eine users-Tabelle einzufügen und zu aktualisieren. Die Transaktion committen wir durch Aufruf der Funktion commit() des MySQLi-Objekts.

Dann reaktivieren wir Autocommit durch den Aufruf der Funktion autocommit() mit dem Argument TRUE. Schließlich schließen wir die MySQLi-Verbindung mit der Methode close() des MySQLi-Objekts.

Prozedurale Syntax

Dieselbe Logik im prozeduralen Stil übergibt die Verbindung als erstes Argument an jede Funktion:

<?php
$link = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    exit();
}

// Turn off autocommit so the statements form one transaction
mysqli_autocommit($link, FALSE);

mysqli_query($link, "INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
mysqli_query($link, "UPDATE users SET name='John Doe' WHERE id=1");

mysqli_commit($link);          // make both changes permanent

mysqli_autocommit($link, TRUE); // restore default behavior
mysqli_close($link);
?>

Rollback bei Fehler

Der eigentliche Vorteil der Deaktivierung von Autocommit ist die Möglichkeit, eine teilweise abgeschlossene Transaktion rückgängig zu machen, wenn etwas schief geht. Das folgende Beispiel umschließt zwei zusammengehörige Aktualisierungen in einer Transaktion und führt einen Rollback durch, wenn eine der Abfragen fehlschlägt, sodass die Datenbank nie in einem halbaktuellen Zustand zurückgelassen wird:

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

$mysqli->autocommit(FALSE); // begin a transaction

$ok = $mysqli->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$ok = $ok && $mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");

if ($ok) {
    $mysqli->commit();
    echo "Transfer completed.";
} else {
    $mysqli->rollback(); // discard both updates
    echo "Transfer failed and was rolled back.";
}

$mysqli->autocommit(TRUE);
$mysqli->close();
?>

Da Autocommit deaktiviert ist, wird keines der UPDATE-Statements gespeichert, bis commit() aufgerufen wird. Wenn die zweite Abfrage fehlschlägt, verwirft rollback() auch die erste, wodurch sichergestellt wird, dass Geld niemals abgebucht wird, ohne gutgeschrieben zu werden.

Erweiterte Verwendung

Die Funktion mysqli_autocommit() wirkt auf Verbindungsebene. Wenn Sie Autocommit von FALSE auf TRUE umschalten, committed MySQLi automatisch jede ausstehende Transaktion. Dieses Verhalten ist nützlich, wenn mehrere unabhängige Transaktionen nacheinander innerhalb desselben Skripts verwaltet werden. Hier ist ein Beispiel:

Erweiterte Verwendung von PHP autocommit()

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit();
}

// Start and commit the first transaction
$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO users (name, email) VALUES ('John', '[email protected]')");
$mysqli->commit();

// Start and commit the second transaction
$mysqli->autocommit(FALSE);
$mysqli->query("UPDATE users SET name='John Doe' WHERE id=1");
$mysqli->commit();

// Re-enable autocommit for subsequent queries
$mysqli->autocommit(TRUE);

$mysqli->close();
?>

In diesem Beispiel deaktivieren wir Autocommit und führen eine INSERT-Abfrage aus. Anschließend committen wir die erste Transaktion explizit. Dann deaktivieren wir Autocommit erneut, um eine zweite Transaktion zu starten, führen eine UPDATE-Abfrage aus und committen sie. Schließlich reaktivieren wir Autocommit und schließen die MySQLi-Verbindung.

Fazit

Die Funktion mysqli_autocommit() gibt Ihnen die Kontrolle darüber, wann MySQLi Ihre Änderungen speichert. Deaktivieren Sie sie mit FALSE, um eine Transaktion zu starten, führen Sie Ihre Anweisungen aus, und rufen Sie dann entweder mysqli_commit() auf, um sie dauerhaft zu machen, oder mysqli_rollback(), um sie zu verwerfen. Dieses Muster ist immer dann unverzichtbar, wenn mehrere Anweisungen als Einheit erfolgreich sein oder fehlschlagen müssen. Reaktivieren Sie Autocommit immer (oder schließen Sie die Verbindung), wenn Sie fertig sind, damit spätere Abfragen wie erwartet funktionieren und Ihre Daten konsistent bleiben.

Übung

Übung
Was macht der Autocommit-Modus in PHP?
Was macht der Autocommit-Modus in PHP?
Was this page helpful?