Start · Sprachen · PHP · Referenz · fbird_rollback_ret

fbird_rollback_ret

Funktion

Setzt eine aktive Firebird/InterBase-Transaktion zurück (Rollback), hält die Transaktion jedoch für weitere Verwendung offen.

seit PHP 5.0.0 Kategorie: db

Signatur

fbird_rollback_ret(resource $link_identifier = null): resource|false

Beschreibung

fbird_rollback_ret() führt einen Rollback auf der angegebenen Transaktion durch und macht dabei alle innerhalb dieser Transaktion vorgenommenen Änderungen rückgängig. Im Gegensatz zu fbird_rollback() wird die Transaktion nach dem Rollback nicht geschlossen, sondern bleibt weiterhin aktiv und kann sofort weiter verwendet werden.

Dies ist nützlich, wenn ein Fehler innerhalb einer Transaktion behandelt werden soll, ohne den gesamten Transaktionskontext zu verlieren. Nach dem Rollback kann die Transaktion neu gestartet werden, ohne eine neue Transaktion explizit eröffnen zu müssen.

Wird kein link_identifier übergeben, verwendet PHP die zuletzt geöffnete Datenbankverbindung und die dazu gehörende Standardtransaktion. Die Funktion gehört zur ibase/fbird-Erweiterung für Firebird- und InterBase-Datenbanken.

Hinweis: Diese Funktion ist ein Alias bzw. äquivalent zu ibase_rollback_ret(). Die fbird_-Variante wurde im Zuge der Umbenennung der Extension eingeführt.

Parameter

Name Typ Default Beschreibung
$link_identifier resource null Eine Transaktions-Ressource, wie sie von fbird_trans() zurückgegeben wird. Wird dieser Parameter weggelassen, wird die Standardtransaktion der zuletzt geöffneten Verbindung verwendet.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt die Transaktions-Ressource zurück, wenn der Rollback erfolgreich war und die Transaktion weiterhin offen ist. Bei einem Fehler wird false zurückgegeben.

Beispiele

Rollback mit offener Transaktion und erneutem Einfügen

<?php
$dbh = fbird_connect('localhost:employees', 'sysdba', 'masterkey');
$trans = fbird_trans($dbh);

// Ersten INSERT – wird zurückgerollt
fbird_query($trans, "INSERT INTO employees (name, salary) VALUES ('Müller', 3500)");

// Rollback, Transaktion bleibt jedoch offen
$trans = fbird_rollback_ret($trans);

if ($trans === false) {
    die('Rollback fehlgeschlagen: ' . fbird_errmsg());
}

// Transaktion ist weiterhin aktiv – neuer Versuch
fbird_query($trans, "INSERT INTO employees (name, salary) VALUES ('Schmidt', 4000)");
fbird_commit($trans);

echo 'Datensatz erfolgreich eingefügt.';
fbird_close($dbh);
?>
Datensatz erfolgreich eingefügt.

Fehlerbehandlung mit bedingtem Rollback und Wiederverwendung

<?php
$dbh = fbird_connect('localhost:inventory', 'sysdba', 'masterkey');
$trans = fbird_trans($dbh);

try {
    $result = fbird_query($trans, "UPDATE stock SET quantity = quantity - 10 WHERE product_id = 99");

    if (!$result) {
        throw new RuntimeException('UPDATE fehlgeschlagen: ' . fbird_errmsg());
    }

    fbird_commit($trans);
    echo 'Bestand aktualisiert.';
} catch (RuntimeException $e) {
    echo 'Fehler: ' . $e->getMessage() . PHP_EOL;

    // Rollback, Transaktion bleibt offen für Logging-Zwecke
    $trans = fbird_rollback_ret($trans);

    // Fehler in Log-Tabelle schreiben (gleiche Transaktion)
    if ($trans !== false) {
        fbird_query($trans, "INSERT INTO error_log (message, logged_at) VALUES ('" . addslashes($e->getMessage()) . "', CURRENT_TIMESTAMP)");
        fbird_commit($trans);
    }
}

fbird_close($dbh);
?>

// Wichtig · Fallstricke

Deprecation-Hinweis: Die fbird_-Funktionen sowie die gesamte ibase/fbird-Erweiterung sind seit PHP 8.0 aus dem PHP-Kern entfernt worden und werden nur noch als PECL-Erweiterung (php-firebird) gepflegt. Für neue Projekte sollte geprüft werden, ob eine aktuelle PECL-Version verfügbar ist.

Beim Einsatz von fbird_rollback_ret() muss beachtet werden, dass die zurückgegebene Ressource der erneuerten Transaktion für weitere Operationen verwendet werden sollte, da sich der interne Zustand ändern kann. Das Ignorieren des Rückgabewerts kann zu unerwartetem Verhalten führen.

Werden Benutzerdaten in SQL-Abfragen verwendet, sollte stets fbird_execute() mit vorbereiteten Statements genutzt werden, um SQL-Injection-Angriffe zu vermeiden.