Start · Sprachen · PHP · Referenz · cubrid_rollback

cubrid_rollback

Funktion

Setzt eine laufende Transaktion in einer CUBRID-Datenbankverbindung zurück und verwirft alle noch nicht festgeschriebenen Änderungen.

seit PHP 8.3.1 Kategorie: db

Signatur

cubrid_rollback(resource $conn_identifier): bool

Beschreibung

cubrid_rollback() macht alle Datenbankänderungen rückgängig, die seit dem letzten cubrid_commit() oder dem Beginn der Verbindung im Auto-Commit-deaktivierten Modus vorgenommen wurden. Die Funktion ist das Gegenstück zu cubrid_commit() und ermöglicht eine sichere Fehlerbehandlung innerhalb von Transaktionen.

CUBRID-Verbindungen arbeiten standardmäßig im Auto-Commit-Modus. Um Transaktionen manuell steuern zu können, muss der Auto-Commit-Modus zunächst mit cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE) deaktiviert werden. Erst dann haben cubrid_commit() und cubrid_rollback() eine Wirkung.

Ein typischer Einsatz ist das Zurücksetzen einer Transaktion, wenn während einer Abfolge von SQL-Operationen ein Fehler auftritt, um die Datenintegrität sicherzustellen. So wird vermieden, dass nur ein Teil der zusammengehörigen Änderungen in die Datenbank übernommen wird.

Nach einem erfolgreichen Rollback beginnt implizit eine neue Transaktion. Alle nachfolgenden SQL-Operationen gehören dieser neuen Transaktion an, bis erneut cubrid_commit() oder cubrid_rollback() aufgerufen wird.

Parameter

Name Typ Default Beschreibung
$conn_identifier Pflicht resource Die CUBRID-Verbindungsressource, die von cubrid_connect() oder cubrid_connect_with_url() zurückgegeben wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Rollback erfolgreich war, andernfalls false. Bei einem ungültigen Verbindungs-Handle oder einem internen Datenbankfehler wird false zurückgegeben.

Beispiele

Transaktion mit Rollback bei Fehler

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');

// Auto-Commit deaktivieren
cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE);

try {
    $result1 = cubrid_execute($conn, "INSERT INTO orders (product_id, quantity) VALUES (1, 10)");
    if (!$result1) {
        throw new RuntimeException('Fehler beim Einfügen der Bestellung.');
    }

    $result2 = cubrid_execute($conn, "UPDATE inventory SET stock = stock - 10 WHERE product_id = 1");
    if (!$result2) {
        throw new RuntimeException('Fehler beim Aktualisieren des Lagerbestands.');
    }

    // Beide Operationen erfolgreich: Transaktion festschreiben
    cubrid_commit($conn);
    echo "Transaktion erfolgreich abgeschlossen.\n";
} catch (RuntimeException $e) {
    // Bei Fehler: alle Änderungen rückgängig machen
    cubrid_rollback($conn);
    echo "Fehler: " . $e->getMessage() . "\nTransaktion zurückgesetzt.\n";
} finally {
    cubrid_disconnect($conn);
}
?>
Transaktion erfolgreich abgeschlossen.

Manuelles Rollback ohne Exception-Handling

<?php
$conn = cubrid_connect('localhost', 33000, 'demodb', 'dba', '');
cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE);

// Ersten Datensatz einfügen
cubrid_execute($conn, "INSERT INTO log_entries (message) VALUES ('Eintrag 1')");

// Zweite Operation schlägt fehl
$res = cubrid_execute($conn, "INSERT INTO log_entries (invalid_column) VALUES ('Eintrag 2')");

if (!$res) {
    // Rollback: Eintrag 1 wird ebenfalls verworfen
    if (cubrid_rollback($conn)) {
        echo "Rollback erfolgreich. Keine Einträge wurden gespeichert.\n";
    } else {
        echo "Rollback fehlgeschlagen!\n";
    }
} else {
    cubrid_commit($conn);
    echo "Transaktion committed.\n";
}

cubrid_disconnect($conn);
?>
Rollback erfolgreich. Keine Einträge wurden gespeichert.

// Wichtig · Fallstricke

Auto-Commit beachten: Ist der Auto-Commit-Modus aktiv (Standardeinstellung), hat cubrid_rollback() keine Wirkung, da jede SQL-Anweisung sofort festgeschrieben wird. Stellen Sie sicher, dass Auto-Commit mit cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE) deaktiviert ist, bevor Sie Transaktionen manuell steuern.

Ressourcen freigeben: Nach einem Rollback sollten offene Abfrage-Ressourcen mit cubrid_close_request() freigegeben werden, um Speicherlecks zu vermeiden.

Verbindungsabbruch: Wenn die Verbindung getrennt wird, ohne dass cubrid_commit() aufgerufen wurde, führt CUBRID automatisch einen Rollback der laufenden Transaktion durch.