Start · Sprachen · PHP · Referenz · mysqli_commit

mysqli_commit

Funktion

Bestätigt (committet) die aktuelle Transaktion der übergebenen MySQL-Datenbankverbindung.

seit PHP 5.0.0 Kategorie: db

Signatur

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

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

Typ
bool
Beschreibung
Gibt 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();
}
Transaktion erfolgreich bestätigt.

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.';
}
Bestellung gespeichert und Verbindung freigegeben.

// 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.