Start · Sprachen · PHP · Referenz · fbird_rollback

fbird_rollback

Funktion

Setzt eine aktive Firebird/InterBase-Transaktion zurück und macht alle Änderungen seit dem letzten Commit rückgängig.

seit PHP 5.0.0 Kategorie: db

Signatur

fbird_rollback(?resource $link_identifier = null): bool

Beschreibung

fbird_rollback() bricht eine laufende Transaktion auf einer Firebird- oder InterBase-Datenbankverbindung ab und stellt den Datenbankzustand vor Beginn der Transaktion wieder her. Alle seit dem letzten ibase_commit() bzw. fbird_commit() vorgenommenen Datenänderungen (INSERT, UPDATE, DELETE) werden verworfen.

Die Funktion wird typischerweise im Fehlerfall eingesetzt, um eine konsistente Datenbank zu gewährleisten – etwa wenn ein mehrstufiger Schreibvorgang fehlschlägt und kein Teilzustand gespeichert werden darf. Sie ist das Gegenstück zu fbird_commit().

Wird kein $link_identifier übergeben, verwendet PHP automatisch die zuletzt geöffnete Datenbankverbindung. Nach einem erfolgreichen Rollback bleibt die Verbindung bestehen und eine neue Transaktion kann begonnen werden.

Hinweis: fbird_rollback() ist ein Alias für ibase_rollback(). Beide Funktionen sind in PHP 8.4 in der Erweiterung ibase / fbird enthalten, wobei die fbird_*-Variante die modernere Benennung darstellt.

Parameter

Name Typ Default Beschreibung
$link_identifier resource|null null Eine optionale Verbindungsressource, die von fbird_connect() oder fbird_pconnect() zurückgegeben wurde. Wird null übergeben oder weggelassen, wird die zuletzt geöffnete Verbindung verwendet. Alternativ kann auch eine Transaktionsressource übergeben werden, die von fbird_trans() erzeugt wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Rollback erfolgreich durchgeführt wurde. Im Fehlerfall (z. B. keine aktive Transaktion oder ungültige Verbindungsressource) wird false zurückgegeben.

Beispiele

Rollback bei fehlgeschlagenem Schreibvorgang

<?php
$dbh = fbird_connect('localhost:db/3050', 'sysdba', 'masterkey', 'UTF-8');

try {
    // Erste Einfügeoperation
    $result1 = fbird_query($dbh, "INSERT INTO orders (id, product) VALUES (1, 'Widget')");
    if (!$result1) {
        throw new RuntimeException('Fehler beim ersten INSERT: ' . fbird_errmsg());
    }

    // Zweite Einfügeoperation (absichtlich fehlerhaft)
    $result2 = fbird_query($dbh, "INSERT INTO order_items (order_id, qty) VALUES (999, 'ungültig')");
    if (!$result2) {
        throw new RuntimeException('Fehler beim zweiten INSERT: ' . fbird_errmsg());
    }

    // Alles erfolgreich: Commit
    fbird_commit($dbh);
    echo "Transaktion erfolgreich gespeichert.";
} catch (RuntimeException $e) {
    // Rollback bei Fehler
    fbird_rollback($dbh);
    echo "Transaktion zurückgesetzt: " . $e->getMessage();
}

fbird_close($dbh);
Transaktion zurückgesetzt: Fehler beim zweiten INSERT: ...

Rollback einer expliziten Transaktion

<?php
$dbh = fbird_connect('localhost:db/3050', 'sysdba', 'masterkey');

// Explizite Transaktion mit bestimmten Flags starten
$trans = fbird_trans(IBASE_WRITE | IBASE_COMMITTED, $dbh);

// Datensatz in der Transaktion aktualisieren
fbird_query($trans, "UPDATE accounts SET balance = balance - 100 WHERE id = 42");

$ok = false; // Simuliertes Fehlerszenario

if ($ok) {
    fbird_commit($trans);
    echo "Buchung gespeichert.";
} else {
    fbird_rollback($trans);
    echo "Buchung verworfen – Kontostand unverändert.";
}

fbird_close($dbh);
Buchung verworfen – Kontostand unverändert.

// Wichtig · Fallstricke

Alias: fbird_rollback() ist ein Alias für ibase_rollback(). In älteren Projekten ist oft nur ibase_rollback() zu finden; beide Funktionen verhalten sich identisch.

Autocommit: Firebird/InterBase arbeitet standardmäßig nicht im Autocommit-Modus. Wird weder fbird_commit() noch fbird_rollback() aufgerufen, werden Änderungen beim Schließen der Verbindung automatisch zurückgerollt. Dies kann zu unerwartetem Datenverlust führen, wenn Commits vergessen werden.

Verfügbarkeit: Die ibase/fbird-Erweiterung muss beim Kompilieren aktiviert worden sein (--with-interbase). Ab PHP 7.4 wurde sie aus dem PHP-Kern ausgelagert und muss separat installiert werden (PECL-Paket ibase oder firebird).