Signatur
Beschreibung
ibase_commit_ret() führt einen sogenannten Soft-Commit (auch Commit Retaining) auf einer Firebird- oder InterBase-Datenbanktransaktion durch. Im Gegensatz zu ibase_commit() wird die Transaktion nach dem Festschreiben nicht geschlossen, sondern bleibt aktiv und kann sofort weiter genutzt werden.
Dies ist besonders nützlich, wenn man innerhalb einer Sitzung viele Datensätze in Batches schreiben möchte, ohne die Transaktion vollständig zu beenden und eine neue öffnen zu müssen. Zwischen zwei Soft-Commits bleiben alle Cursor und offenen Statements gültig, was Performance-Vorteile beim massenhaften Einfügen oder Aktualisieren von Datensätzen bietet.
Wird kein Parameter übergeben, arbeitet die Funktion auf der zuletzt gestarteten Transaktion der Standard-Datenbankverbindung. Alternativ kann ein spezifischer Transaktions-Handle oder ein Verbindungs-Handle übergeben werden, um gezielt eine bestimmte Transaktion anzusprechen.
Hinweis: Die Interbase-Extension (ibase_*) ist ab PHP 7.4 aus dem PHP-Kern entfernt worden und steht nur noch über die PECL-Extension ibase oder den Fork FirebirdSQL/php-firebird zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $link_or_trans_identifier | resource | null | Ein Transaktions-Handle (erzeugt mit ibase_trans()) oder ein Verbindungs-Handle (erzeugt mit ibase_connect() bzw. ibase_pconnect()). Wird null übergeben, wird die zuletzt gestartete Transaktion der Standard-Verbindung verwendet. |
Rückgabewert
true bei Erfolg zurück. Im Fehlerfall wird false zurückgegeben und ein Fehler ausgelöst.Beispiele
Batch-Insert mit Commit Retaining
<?php
$dbh = ibase_connect('localhost:/var/db/mydb.fdb', 'sysdba', 'masterkey');
$trans = ibase_trans(IBASE_WRITE | IBASE_COMMITTED, $dbh);
$stmt = ibase_prepare($trans, 'INSERT INTO produkte (name, preis) VALUES (?, ?)');
$produkte = [
['Widget A', 9.99],
['Widget B', 14.99],
['Widget C', 4.49],
];
foreach ($produkte as $index => $produkt) {
ibase_execute($stmt, $produkt[0], $produkt[1]);
// Alle 2 Datensätze einen Soft-Commit durchführen
if (($index + 1) % 2 === 0) {
if (ibase_commit_ret($trans)) {
echo "Soft-Commit nach " . ($index + 1) . " Datensätzen.\n";
}
}
}
// Abschließenden harten Commit durchführen und Transaktion beenden
ibase_commit($trans);
ibase_close($dbh);
echo "Alle Datensätze gespeichert.\n";
Soft-Commit auf Standard-Verbindung
<?php
// Verbindung zur Datenbank herstellen
$dbh = ibase_connect('localhost:/var/db/mydb.fdb', 'sysdba', 'masterkey');
// Datensatz einfügen
ibase_query($dbh, "INSERT INTO log (nachricht) VALUES ('Eintrag 1')");
// Soft-Commit: Daten werden gesichert, Transaktion bleibt offen
$result = ibase_commit_ret();
if ($result) {
echo "Soft-Commit erfolgreich, Transaktion ist noch aktiv.\n";
}
// Weitere Operationen in derselben Transaktion möglich
ibase_query($dbh, "INSERT INTO log (nachricht) VALUES ('Eintrag 2')");
// Transaktion endgültig abschließen
ibase_commit();
ibase_close($dbh);
// Wichtig · Fallstricke
Deprecation / Verfügbarkeit: Die ibase_*-Funktionen wurden mit PHP 7.4 aus dem offiziellen PHP-Kern entfernt. Für neuere PHP-Versionen muss die PECL-Extension ibase oder die Community-Fork-Extension für Firebird separat installiert werden.
Performance-Hinweis: Commit Retaining hat in Firebird/InterBase den Nachteil, dass die Datenbank alle Versionen der geänderten Datensätze seit dem Start der ursprünglichen Transaktion im Speicher halten muss. Bei sehr vielen aufeinanderfolgenden Soft-Commits in einer einzigen Transaktion kann dies den Speicherverbrauch des Datenbankservers deutlich erhöhen. In solchen Fällen empfiehlt es sich, die Transaktion regelmäßig vollständig mit ibase_commit() zu beenden und neu zu starten.
Fehlerbehandlung: Im Fehlerfall liefert die Funktion false. Fehlermeldungen können mit ibase_errmsg() und Fehlercodes mit ibase_errcode() abgefragt werden.