Start · Sprachen · PHP · Referenz · odbc_commit

odbc_commit

Funktion

Schließt eine offene ODBC-Transaktion ab (Commit) und schreibt alle Änderungen dauerhaft in die Datenbank.

seit PHP 4.0.0 Kategorie: db

Signatur

odbc_commit(resource $odbc): bool

Beschreibung

odbc_commit() beendet eine aktive Transaktion auf einer ODBC-Verbindung, indem alle seit dem letzten Commit oder Rollback vorgenommenen Änderungen dauerhaft gespeichert werden. Die Funktion wird typischerweise eingesetzt, wenn der Autocommit-Modus der ODBC-Verbindung deaktiviert wurde (via odbc_autocommit($odbc, false)).

Der Transaktionsmechanismus ermöglicht es, mehrere Datenbankoperationen atomar durchzuführen: Entweder werden alle Änderungen übernommen (Commit) oder alle verworfen (Rollback). Dies ist besonders wichtig bei zusammenhängenden Operationen, die nur gemeinsam sinnvoll sind, etwa beim Übertragen von Bestelldaten und dem gleichzeitigen Aktualisieren des Lagerbestands.

Im Fehlerfall sollte statt odbc_commit() die Funktion odbc_rollback() aufgerufen werden, um alle Änderungen der laufenden Transaktion rückgängig zu machen. Nach einem erfolgreichen Commit oder Rollback beginnt automatisch eine neue Transaktion, wenn der Autocommit-Modus deaktiviert bleibt.

Nicht alle ODBC-Treiber und Datenbanken unterstützen Transaktionen. Bei Treibern ohne Transaktionsunterstützung kann das Verhalten dieser Funktion undefiniert sein — überprüfe daher die Fähigkeiten deines ODBC-Treibers vorab.

Parameter

Name Typ Default Beschreibung
$odbc Pflicht resource Eine aktive ODBC-Verbindungsressource, wie sie von odbc_connect() oder odbc_pconnect() zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Commit erfolgreich war. Bei einem Fehler (z. B. keine aktive Transaktion, Verbindungsproblem) wird false zurückgegeben.

Beispiele

Einfache Transaktion mit Commit und Rollback

<?php
$odbc = odbc_connect('MeineDSN', 'benutzer', 'passwort');

if (!$odbc) {
    die('Verbindung fehlgeschlagen: ' . odbc_errormsg());
}

// Autocommit deaktivieren, um manuelle Transaktionskontrolle zu ermöglichen
odbc_autocommit($odbc, false);

try {
    odbc_exec($odbc, "INSERT INTO bestellungen (kunde_id, betrag) VALUES (42, 99.99)");
    odbc_exec($odbc, "UPDATE lager SET menge = menge - 1 WHERE artikel_id = 7");

    // Alle Änderungen dauerhaft speichern
    if (odbc_commit($odbc)) {
        echo "Transaktion erfolgreich abgeschlossen.";
    } else {
        throw new RuntimeException('Commit fehlgeschlagen: ' . odbc_errormsg($odbc));
    }
} catch (RuntimeException $e) {
    // Im Fehlerfall alle Änderungen rückgängig machen
    odbc_rollback($odbc);
    echo "Transaktion zurückgerollt: " . $e->getMessage();
} finally {
    odbc_close($odbc);
}
Transaktion erfolgreich abgeschlossen.

Batch-Insert mit manueller Transaktionskontrolle

<?php
$odbc = odbc_connect('MeineDSN', 'benutzer', 'passwort');
odbc_autocommit($odbc, false);

$datensaetze = [
    ['Anna', 'Schmidt'],
    ['Max', 'Müller'],
    ['Lena', 'Braun'],
];

$fehler = false;
foreach ($datensaetze as [$vorname, $nachname]) {
    $sql = sprintf(
        "INSERT INTO personen (vorname, nachname) VALUES ('%s', '%s')",
        odbc_escape_string($vorname),
        odbc_escape_string($nachname)
    );
    if (!odbc_exec($odbc, $sql)) {
        $fehler = true;
        break;
    }
}

if ($fehler) {
    odbc_rollback($odbc);
    echo "Fehler aufgetreten – alle Einfügungen wurden verworfen.";
} else {
    odbc_commit($odbc);
    echo "Alle " . count($datensaetze) . " Datensätze erfolgreich gespeichert.";
}

odbc_close($odbc);
Alle 3 Datensätze erfolgreich gespeichert.

// Wichtig · Fallstricke

Autocommit-Modus: Im Standard-Autocommit-Modus wird jede SQL-Anweisung sofort in die Datenbank geschrieben. odbc_commit() hat in diesem Modus keine Wirkung — deaktiviere den Autocommit-Modus zuerst mit odbc_autocommit($odbc, false).

Sicherheit: Stelle sicher, dass bei Fehlern stets odbc_rollback() aufgerufen wird, um inkonsistente Datenbankzustände zu vermeiden. Verwende try-catch-finally-Blöcke, um auch bei unerwarteten Ausnahmen einen Rollback durchzuführen.

Treiberkompatibilität: Nicht alle ODBC-Treiber unterstützen Transaktionen. Prüfe, ob dein Treiber die SQL-Eigenschaft SQL_TXN_CAPABLE unterstützt, bevor du auf Transaktionen setzt.