Signatur
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
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);
?>
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.