Start · Sprachen · PHP · Referenz · ibase_rollback_ret

ibase_rollback_ret

Funktion

Macht eine Interbase/Firebird-Transaktion rückgängig, ohne sie zu schließen, sodass sie weiterverwendet werden kann.

seit PHP 5.0.0 Kategorie: db

Signatur

ibase_rollback_ret(resource $link_identifier = null): bool

Beschreibung

ibase_rollback_ret() setzt alle Änderungen einer aktiven Interbase- oder Firebird-Datenbanktransaktion zurück (Rollback), lässt die Transaktion jedoch geöffnet. Dies unterscheidet sich von ibase_rollback(), das die Transaktion nach dem Zurücksetzen vollständig schließt.

Die Funktion ist nützlich, wenn nach einem Fehler oder einer Validierungsprüfung alle bisher vorgenommenen Änderungen verworfen werden sollen, die Transaktion aber für weitere Operationen weiterhin aktiv bleiben muss – ohne erneut eine neue Transaktion öffnen zu müssen.

Wird kein $link_identifier angegeben, wird die zuletzt geöffnete Transaktion verwendet. Typischerweise wird eine Transaktion zunächst mit ibase_trans() gestartet und nach dem Rollback-Retain mit weiteren Datenbankoperationen fortgesetzt, bevor sie schließlich mit ibase_commit() oder ibase_rollback() abgeschlossen wird.

Hinweis: Die Interbase/Firebird-Erweiterung (ibase_*) wurde mit PHP 8.0 aus dem PHP-Kern entfernt und ist seitdem nur noch über die PECL-Extension ibase verfügbar.

Parameter

Name Typ Default Beschreibung
$link_identifier resource null Eine Transaktions-Ressource, die zuvor mit ibase_trans() erstellt wurde. Wird dieser Parameter weggelassen, wird die zuletzt verwendete Transaktion des aktuellen Skripts genommen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die angegebene Ressource ungültig ist oder keine aktive Transaktion vorhanden ist).

Beispiele

Rollback-Retain und Weiterverwendung der Transaktion

<?php
$dbh = ibase_connect('localhost:mydb.fdb', 'sysdba', 'masterkey');

// Neue Transaktion starten
$trans = ibase_trans(IBASE_DEFAULT, $dbh);

// Erste Operation
ibase_query($trans, "INSERT INTO orders (product, quantity) VALUES ('Widget', 10)");

// Fehler erkannt — Änderungen zurücksetzen, Transaktion offen lassen
if (ibase_rollback_ret($trans)) {
    echo "Rollback erfolgreich, Transaktion bleibt aktiv." . PHP_EOL;
} else {
    echo "Rollback fehlgeschlagen." . PHP_EOL;
}

// Transaktion weiterhin verfügbar — neue Operation ausführen
ibase_query($trans, "INSERT INTO orders (product, quantity) VALUES ('Gadget', 5)");

// Transaktion abschließend committen
ibase_commit($trans);

ibase_close($dbh);
?>
Rollback erfolgreich, Transaktion bleibt aktiv.

Wiederholungslogik mit Rollback-Retain

<?php
$dbh = ibase_connect('localhost:mydb.fdb', 'sysdba', 'masterkey');
$trans = ibase_trans(IBASE_DEFAULT, $dbh);

$versuche = 0;
$maxVersuche = 3;
$erfolgreich = false;

while ($versuche < $maxVersuche && !$erfolgreich) {
    $versuche++;
    $menge = rand(1, 100); // Simulierter Eingabewert

    if ($menge <= 0 || $menge > 50) {
        // Ungültige Menge — Rollback-Retain und erneut versuchen
        echo "Ungültige Menge ($menge), Versuch $versuche — Rollback." . PHP_EOL;
        ibase_rollback_ret($trans);
    } else {
        ibase_query($trans, "INSERT INTO orders (product, quantity) VALUES ('Teil', $menge)");
        ibase_commit($trans);
        echo "Erfolgreich eingefügt: Menge $menge nach $versuche Versuch(en)." . PHP_EOL;
        $erfolgreich = true;
    }
}

if (!$erfolgreich) {
    ibase_rollback($trans);
    echo "Alle Versuche fehlgeschlagen — Transaktion endgültig zurückgesetzt." . PHP_EOL;
}

ibase_close($dbh);
?>

// Wichtig · Fallstricke

Deprecation/Entfernung: Die ibase_*-Funktionen wurden in PHP 7.4 als veraltet markiert und in PHP 8.0 aus dem PHP-Kern entfernt. Für PHP 8.x steht die PECL-Extension ibase zur Verfügung, alternativ sollte die PDO-Extension mit dem Firebird-Treiber verwendet werden.

Es ist wichtig, eine mit ibase_rollback_ret() offen gehaltene Transaktion am Ende immer explizit mit ibase_commit() oder ibase_rollback() zu schließen, um Ressourcenlecks und inkonsistente Datenbankzustände zu vermeiden.