Start · Sprachen · PHP · Referenz · odbc_rollback

odbc_rollback

Funktion

Bricht eine laufende ODBC-Transaktion ab und macht alle seit dem letzten <code>odbc_commit()</code> oder dem Start der Transaktion vorgenommenen Änderungen rückgängig.

seit PHP 4.0.0 Kategorie: db

Signatur

odbc_rollback(resource $odbc): bool

Beschreibung

odbc_rollback() wird verwendet, um eine aktive ODBC-Transaktion zu verwerfen. Alle Datenbankoperationen (INSERT, UPDATE, DELETE usw.), die nach dem letzten odbc_commit() bzw. nach dem Deaktivieren des Auto-Commit-Modus ausgeführt wurden, werden vollständig zurückgerollt, als wären sie nie ausgeführt worden.

Damit odbc_rollback() sinnvoll eingesetzt werden kann, muss der Auto-Commit-Modus der ODBC-Verbindung zuvor mit odbc_autocommit($odbc, false) deaktiviert worden sein. Im Auto-Commit-Modus wird jede SQL-Anweisung sofort und automatisch festgeschrieben, sodass ein Rollback keine Wirkung mehr hätte.

Typischer Einsatz ist ein try-catch-Block, in dem bei einem Fehler odbc_rollback() aufgerufen wird, um die Datenkonsistenz zu gewährleisten. Dadurch werden keine halbfertigen Datenbankzustände hinterlassen, die zu Inkonsistenzen führen könnten.

  • Stets in Kombination mit odbc_autocommit() und odbc_commit() verwenden.
  • Nicht alle ODBC-Datenbanktreiber und -Backends unterstützen Transaktionen vollständig.

Parameter

Name Typ Default Beschreibung
$odbc Pflicht resource Eine gültige ODBC-Verbindungsressource, die zuvor mit odbc_connect() oder odbc_pconnect() geöffnet wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Rollback erfolgreich war, andernfalls false — beispielsweise wenn die Verbindung ungültig ist oder der Treiber keine Transaktionen unterstützt.

Beispiele

Transaktion mit Rollback bei Fehler

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

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

// Auto-Commit deaktivieren
odbc_autocommit($odbc, false);

try {
    $result1 = odbc_exec($odbc, "INSERT INTO bestellungen (produkt_id, menge) VALUES (42, 5)");
    if (!$result1) {
        throw new RuntimeException('Fehler beim Einfügen der Bestellung.');
    }

    $result2 = odbc_exec($odbc, "UPDATE lager SET menge = menge - 5 WHERE produkt_id = 42");
    if (!$result2) {
        throw new RuntimeException('Fehler beim Aktualisieren des Lagerbestands.');
    }

    // Alles erfolgreich — Transaktion festschreiben
    odbc_commit($odbc);
    echo 'Transaktion erfolgreich abgeschlossen.';
} catch (RuntimeException $e) {
    // Fehler aufgetreten — alle Änderungen zurückrollen
    odbc_rollback($odbc);
    echo 'Transaktion abgebrochen: ' . $e->getMessage();
} finally {
    odbc_close($odbc);
}
Transaktion abgebrochen: Fehler beim Aktualisieren des Lagerbestands.

Rollback nach manueller Fehlerprüfung

<?php
$odbc = odbc_connect('MeineDSN', 'user', 'pass');
odbc_autocommit($odbc, false);

$ok = odbc_exec($odbc, "DELETE FROM temp_log WHERE erstellt_am &lt; '2023-01-01'");

if ($ok) {
    odbc_commit($odbc);
    echo 'Alte Einträge erfolgreich gelöscht.';
} else {
    odbc_rollback($odbc);
    echo 'Löschvorgang fehlgeschlagen, Rollback durchgeführt.';
}

odbc_close($odbc);
Alte Einträge erfolgreich gelöscht.

// Wichtig · Fallstricke

Auto-Commit beachten: Wenn Auto-Commit aktiv ist (Standardeinstellung), hat odbc_rollback() keine Wirkung, da jede Anweisung bereits sofort festgeschrieben wird. Stets zuerst odbc_autocommit($odbc, false) aufrufen.

Treiber-Kompatibilität: Nicht alle ODBC-Backends unterstützen Transaktionen (z. B. bestimmte CSV- oder Text-Treiber). Prüfen Sie die Dokumentation des verwendeten Datenbanktreibers, bevor Sie auf Transaktionssupport vertrauen.

Ressourcenfreigabe: Nach einem Rollback sollte der Verbindungszustand mit odbc_autocommit() ggf. zurückgesetzt und die Verbindung ordentlich mit odbc_close() geschlossen werden, um Ressourcenlecks zu vermeiden.