Start · Sprachen · PHP · Referenz · db2_commit

db2_commit

Funktion

Bestätigt eine laufende Transaktion auf einer IBM DB2-, Cloudscape- oder Apache-Derby-Datenbankverbindung und macht alle Änderungen dauerhaft.

seit PHP 5.1.0 Kategorie: db

Signatur

db2_commit(resource $connection): bool

Beschreibung

db2_commit() schließt eine aktive Transaktion ab, indem alle seit dem letzten db2_commit()- oder db2_rollback()-Aufruf vorgenommenen Datenbankänderungen dauerhaft gespeichert werden. Die Funktion wird benötigt, wenn Autocommit für die Verbindung deaktiviert wurde (d. h. SQL_ATTR_AUTOCOMMIT ist auf DB2_AUTOCOMMIT_OFF gesetzt).

Transaktionen ermöglichen es, mehrere zusammengehörige Datenbankoperationen atomar zu behandeln: Entweder werden alle Änderungen dauerhaft übernommen (commit) oder vollständig zurückgerollt (rollback). Dies ist essenziell für Szenarien wie Buchungssysteme, Bestellprozesse oder andere Anwendungsfälle, bei denen Datenkonsistenz kritisch ist.

Typischerweise wird db2_commit() am Ende eines erfolgreichen Transaktionsblocks aufgerufen, während db2_rollback() im Fehlerfall alle Änderungen verwirft. Nach dem Commit beginnt automatisch eine neue Transaktion, sofern Autocommit weiterhin deaktiviert ist.

Parameter

Name Typ Default Beschreibung
$connection Pflicht resource Eine gültige DB2-Verbindungsressource, die zuvor mit db2_connect() oder db2_pconnect() erstellt wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Transaktion erfolgreich bestätigt wurde. Gibt false zurück, wenn ein Fehler aufgetreten ist, z. B. wenn keine aktive Transaktion vorhanden ist oder die Verbindung ungültig ist.

Beispiele

Einfacher Transaktions-Commit nach INSERT

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheimesPasswort');

if ($conn) {
    // Autocommit deaktivieren
    db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);

    $sql = "INSERT INTO bestellungen (kunde_id, produkt_id, menge) VALUES (42, 7, 3)";
    $stmt = db2_exec($conn, $sql);

    if ($stmt) {
        // Transaktion erfolgreich bestätigen
        if (db2_commit($conn)) {
            echo "Bestellung erfolgreich gespeichert.";
        } else {
            echo "Commit fehlgeschlagen: " . db2_conn_errormsg($conn);
        }
    } else {
        // Bei Fehler zurückrollen
        db2_rollback($conn);
        echo "INSERT fehlgeschlagen, Transaktion zurückgerollt.";
    }

    db2_close($conn);
}
Bestellung erfolgreich gespeichert.

Mehrstufige Transaktion mit Commit oder Rollback

<?php
$conn = db2_connect('SAMPLE', 'db2user', 'geheimesPasswort');

if ($conn) {
    db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);

    $fehler = false;

    // Schritt 1: Kontostand verringern
    $stmt1 = db2_exec($conn, "UPDATE konten SET saldo = saldo - 100 WHERE id = 1");
    if (!$stmt1) {
        $fehler = true;
    }

    // Schritt 2: Kontostand erhöhen
    $stmt2 = db2_exec($conn, "UPDATE konten SET saldo = saldo + 100 WHERE id = 2");
    if (!$stmt2) {
        $fehler = true;
    }

    if ($fehler) {
        db2_rollback($conn);
        echo "Überweisung fehlgeschlagen. Alle Änderungen wurden zurückgerollt.";
    } else {
        db2_commit($conn);
        echo "Überweisung erfolgreich abgeschlossen.";
    }

    db2_close($conn);
}
Überweisung erfolgreich abgeschlossen.

// Wichtig · Fallstricke

Autocommit beachten: Wenn Autocommit für die Verbindung aktiviert ist (Standardzustand bei db2_connect()), hat db2_commit() keine Wirkung, da jede Anweisung automatisch einzeln bestätigt wird. db2_autocommit() muss mit DB2_AUTOCOMMIT_OFF aufgerufen werden, bevor manuelle Commits sinnvoll sind.

Fehlerbehandlung: Im Fehlerfall sollte immer db2_rollback() aufgerufen werden, um einen konsistenten Datenbankzustand sicherzustellen. Fehlermeldungen können über db2_conn_errormsg() abgerufen werden.

Persistente Verbindungen: Bei persistenten Verbindungen (db2_pconnect()) wird empfohlen, am Anfang jeder Anfrage den Status der Verbindung zu prüfen und ggf. offene Transaktionen mit db2_rollback() zu bereinigen.