Signatur
Beschreibung
mysqli_commit() schreibt alle Änderungen der laufenden Transaktion dauerhaft in die Datenbank. Sie wird typischerweise am Ende eines atomaren Arbeitsschritts aufgerufen, nachdem mehrere DML-Anweisungen (INSERT, UPDATE, DELETE) erfolgreich ausgeführt wurden. Im Fehlerfall sollte stattdessen mysqli_rollback() verwendet werden, um alle Änderungen rückgängig zu machen.
Damit Transaktionen überhaupt wirksam sind, muss der Auto-Commit-Modus zuvor mit mysqli_autocommit($mysql, false) deaktiviert worden sein. Andernfalls wird jede SQL-Anweisung sofort und automatisch bestätigt.
Der optionale Parameter $flags erlaubt die Übergabe von Flags wie MYSQLI_TRANS_COR_AND_NO_CHAIN oder MYSQLI_TRANS_COR_RELEASE, um das Verhalten nach dem Commit zu steuern (z. B. die Verbindung freigeben). Mit $name kann ein Savepoint-Name angegeben werden, bis zu dem committed werden soll.
Diese Funktion steht sowohl als prozedurale Funktion als auch als Methode des mysqli-Objekts ($mysqli->commit()) zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive MySQL-Verbindungsressource, die mit mysqli_connect() oder new mysqli() erstellt wurde. |
|
| $flags | int | 0 | Optionale Transaktions-Flags. Mögliche Werte: MYSQLI_TRANS_COR_AND_CHAIN, MYSQLI_TRANS_COR_AND_NO_CHAIN, MYSQLI_TRANS_COR_RELEASE, MYSQLI_TRANS_COR_NO_RELEASE. |
| $name | ?string | null | Optionaler Name eines Savepoints, bis zu dem die Transaktion bestätigt werden soll. Wird als COMMIT TO SAVEPOINT name ausgeführt. |
Rückgabewert
true zurück, wenn der Commit erfolgreich war, andernfalls false. Im Fehlerfall sollte mysqli_rollback() aufgerufen werden.Beispiele
Einfache Transaktion mit Commit und Rollback
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'shop');
if ($mysqli->connect_errno) {
die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}
// Auto-Commit deaktivieren
$mysqli->autocommit(false);
try {
$mysqli->query("UPDATE konto SET guthaben = guthaben - 100 WHERE id = 1");
$mysqli->query("UPDATE konto SET guthaben = guthaben + 100 WHERE id = 2");
// Transaktion bestätigen
if (!$mysqli->commit()) {
throw new RuntimeException('Commit fehlgeschlagen.');
}
echo 'Transaktion erfolgreich bestätigt.';
} catch (RuntimeException $e) {
$mysqli->rollback();
echo 'Fehler: ' . $e->getMessage() . ' — Transaktion zurückgerollt.';
} finally {
$mysqli->autocommit(true);
$mysqli->close();
}
Prozedurale Schreibweise mit Flags
<?php
$link = mysqli_connect('localhost', 'user', 'password', 'shop');
if (!$link) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
mysqli_autocommit($link, false);
mysqli_query($link, "INSERT INTO bestellungen (artikel_id, menge) VALUES (42, 3)");
// Commit mit anschließender Freigabe der Verbindung
if (mysqli_commit($link, MYSQLI_TRANS_COR_RELEASE)) {
echo 'Bestellung gespeichert und Verbindung freigegeben.';
} else {
mysqli_rollback($link);
echo 'Fehler beim Commit.';
}
// Wichtig · Fallstricke
Wichtig: mysqli_commit() funktioniert nur mit transaktionsfähigen Speicher-Engines wie InnoDB. Bei MyISAM-Tabellen werden Änderungen stets sofort geschrieben und können nicht zurückgerollt werden.
Wird die Verbindung ohne vorherigen Commit geschlossen (z. B. durch ein Script-Ende oder einen Fehler), führt MySQL automatisch einen Rollback der noch offenen Transaktion durch. Es empfiehlt sich daher, immer explizit zu committen oder zurückzurollen.
Bei der Verwendung von $name muss der Savepoint zuvor mit mysqli_savepoint() gesetzt worden sein, sonst schlägt der Commit fehl.