Start · Sprachen · PHP · Referenz · mysqli_autocommit

mysqli_autocommit

Funktion

Aktiviert oder deaktiviert den Autocommit-Modus für eine MySQL-Datenbankverbindung.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_autocommit(mysqli $mysql, bool $enable): bool

Beschreibung

mysqli_autocommit() steuert, ob Datenbankänderungen auf einer MySQL-Verbindung automatisch nach jeder Anweisung dauerhaft gespeichert (committed) werden. Standardmäßig ist Autocommit in MySQL aktiviert, d. h. jede SQL-Anweisung wird sofort und unwiderruflich in die Datenbank geschrieben.

Wird Autocommit deaktiviert (false), beginnt implizit eine Transaktion. Alle nachfolgenden Datenbankoperationen (INSERT, UPDATE, DELETE) werden erst dann dauerhaft gespeichert, wenn explizit mysqli_commit() aufgerufen wird, oder rückgängig gemacht, wenn mysqli_rollback() verwendet wird. Dies ist essenziell für atomare Operationen, die entweder vollständig oder gar nicht ausgeführt werden sollen.

Die Funktion ist besonders nützlich bei Bankübertragungen, Bestellvorgängen oder anderen mehrstufigen Datenbankoperationen, bei denen Datenkonsistenz kritisch ist. Sie funktioniert nur mit transaktionsfähigen Speicher-Engines wie InnoDB; MyISAM ignoriert Transaktionen.

Die objektorientierte Entsprechung ist $mysqli->autocommit(bool $enable).

Parameter

Name Typ Default Beschreibung
$mysql Pflicht mysqli Eine aktive MySQLi-Verbindungsinstanz, die mit mysqli_connect() oder new mysqli() erstellt wurde.
$enable Pflicht bool true aktiviert den Autocommit-Modus (Standard in MySQL), false deaktiviert ihn und startet den manuellen Transaktionsmodus.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Modus erfolgreich gesetzt wurde, andernfalls false. Im Fehlerfall kann mysqli_error() zur Fehleranalyse genutzt werden.

Beispiele

Einfache Transaktion mit Autocommit deaktivieren

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'shop');

if ($mysqli->connect_errno) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

// Autocommit deaktivieren
mysqli_autocommit($mysqli, false);

// Zwei zusammengehörige Operationen
$ok1 = $mysqli->query("UPDATE konten SET guthaben = guthaben - 100 WHERE id = 1");
$ok2 = $mysqli->query("UPDATE konten SET guthaben = guthaben + 100 WHERE id = 2");

if ($ok1 && $ok2) {
    mysqli_commit($mysqli);
    echo 'Überweisung erfolgreich durchgeführt.';
} else {
    mysqli_rollback($mysqli);
    echo 'Fehler! Transaktion wurde rückgängig gemacht.';
}

// Autocommit wieder aktivieren
mysqli_autocommit($mysqli, true);

$mysqli->close();
Überweisung erfolgreich durchgeführt.

Objektorientierte Nutzung mit Fehlerbehandlung

<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'bestellsystem');

$mysqli->autocommit(false);

try {
    $mysqli->query("INSERT INTO bestellungen (kunde_id, produkt_id, menge) VALUES (42, 7, 3)");
    
    if ($mysqli->affected_rows !== 1) {
        throw new RuntimeException('Bestellung konnte nicht gespeichert werden.');
    }
    
    $mysqli->query("UPDATE lager SET bestand = bestand - 3 WHERE produkt_id = 7");
    
    if ($mysqli->affected_rows !== 1) {
        throw new RuntimeException('Lagerbestand konnte nicht aktualisiert werden.');
    }
    
    $mysqli->commit();
    echo 'Bestellung und Lageraktualisierung erfolgreich.';
} catch (RuntimeException $e) {
    $mysqli->rollback();
    echo 'Fehler: ' . $e->getMessage();
} finally {
    $mysqli->autocommit(true);
    $mysqli->close();
}
Bestellung und Lageraktualisierung erfolgreich.

// Wichtig · Fallstricke

Wichtig: DDL-Anweisungen wie CREATE TABLE, ALTER TABLE oder DROP TABLE führen in MySQL immer einen impliziten Commit durch, unabhängig vom Autocommit-Einstellung. Eine laufende Transaktion wird dadurch unwiderruflich beendet.

Speicher-Engine beachten: Transaktionen werden nur von transaktionsfähigen Engines wie InnoDB unterstützt. Bei Tabellen mit der MyISAM-Engine hat mysqli_autocommit() keinen Effekt — Änderungen werden sofort dauerhaft geschrieben.

Bei der Verwendung von persistenten Verbindungen (pconnect) sollte der Autocommit-Status zu Beginn jeder Anfrage explizit gesetzt werden, da der Zustand der Verbindung aus einem vorherigen Request übernommen werden kann.