Start · Sprachen · PHP · Referenz · db2_rollback

db2_rollback

Funktion

Macht alle seit dem letzten Commit oder Rollback vorgenommenen Datenbankänderungen einer IBM Db2-Verbindung rückgängig.

seit PHP 5.1.0 Kategorie: db

Signatur

db2_rollback(resource $connection): bool

Beschreibung

db2_rollback() verwirft alle ausstehenden Änderungen der aktuellen Transaktion auf einer IBM Db2-Datenbankverbindung. Die Funktion wird typischerweise im Fehlerfall eingesetzt, um sicherzustellen, dass ein inkonsistenter Datenbankzustand vermieden wird – beispielsweise wenn ein Teil einer mehrteiligen Transaktion fehlschlägt.

Die Funktion setzt voraus, dass die Verbindung im manuellen Transaktionsmodus betrieben wird. Diesen Modus aktiviert man mit db2_autocommit($conn, DB2_AUTOCOMMIT_OFF). Im Standard-Autocommit-Modus wird jede Anweisung sofort festgeschrieben, sodass db2_rollback() dort keine Wirkung hat.

Ein typisches Muster ist das Einschließen von mehreren zusammenhängenden db2_exec()- oder db2_execute()-Aufrufen in einem try/catch-Block: Bei Erfolg wird db2_commit() aufgerufen, im Fehlerfall db2_rollback(). Damit bleiben zusammengehörige Datensätze immer konsistent.

Parameter

Name Typ Default Beschreibung
$connection Pflicht resource Eine aktive IBM Db2-Datenbankverbindung, wie sie von db2_connect() oder db2_pconnect() zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Rollback erfolgreich durchgeführt wurde, andernfalls false.

Beispiele

Rollback bei fehlgeschlagener Transaktion

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

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

    $sql1 = "INSERT INTO orders (customer_id, total) VALUES (42, 199.99)";
    $sql2 = "UPDATE inventory SET stock = stock - 1 WHERE product_id = 7";

    $result1 = db2_exec($conn, $sql1);
    $result2 = db2_exec($conn, $sql2);

    if ($result1 && $result2) {
        db2_commit($conn);
        echo "Transaktion erfolgreich abgeschlossen.";
    } else {
        db2_rollback($conn);
        echo "Fehler – Transaktion wurde zurückgerollt: " . db2_stmt_errormsg();
    }

    db2_close($conn);
}
?>
Fehler – Transaktion wurde zurückgerollt: ...

Rollback mit try/catch-Muster

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

if (!$conn) {
    die('Verbindung fehlgeschlagen: ' . db2_conn_errormsg());
}

db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);

try {
    $stmtA = db2_exec($conn, "DELETE FROM sessions WHERE expired = 1");
    if (!$stmtA) {
        throw new RuntimeException('DELETE fehlgeschlagen: ' . db2_stmt_errormsg());
    }

    $stmtB = db2_exec($conn, "INSERT INTO audit_log (action) VALUES ('session_cleanup')");
    if (!$stmtB) {
        throw new RuntimeException('INSERT fehlgeschlagen: ' . db2_stmt_errormsg());
    }

    db2_commit($conn);
    echo "Bereinigung erfolgreich committed.";
} catch (RuntimeException $e) {
    db2_rollback($conn);
    echo "Rollback durchgeführt: " . $e->getMessage();
} finally {
    db2_close($conn);
}
?>
Bereinigung erfolgreich committed.

// Wichtig · Fallstricke

Autocommit beachten: db2_rollback() hat nur eine Wirkung, wenn Autocommit zuvor mit db2_autocommit($conn, DB2_AUTOCOMMIT_OFF) deaktiviert wurde. Im Standard-Autocommit-Modus werden Änderungen sofort festgeschrieben und können nicht mehr zurückgerollt werden.

Savepoints: IBM Db2 unterstützt Savepoints. Soll nur ein Teil einer Transaktion zurückgerollt werden, kann über db2_exec($conn, 'ROLLBACK TO SAVEPOINT mein_savepoint') ein partielles Rollback erfolgen.

Persistente Verbindungen: Bei Verwendung von db2_pconnect() (persistente Verbindungen) kann es vorkommen, dass eine vorherige Transaktion noch offen ist. Es empfiehlt sich daher, nach dem Aufbau einer persistenten Verbindung vorsorglich db2_rollback() aufzurufen.