Start · Sprachen · PHP · Referenz · ibase_commit_ret

ibase_commit_ret

Funktion

Schreibt eine aktive Firebird/InterBase-Transaktion fest, ohne sie zu beenden – die Transaktion bleibt für weitere Operationen geöffnet.

seit PHP 5.0.0 Kategorie: db

Signatur

ibase_commit_ret(resource $link_or_trans_identifier = null): bool

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

Typ
bool
Beschreibung
Gibt 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 nach 2 Datensätzen. Alle Datensätze gespeichert.

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);
Soft-Commit erfolgreich, Transaktion ist noch aktiv.

// 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.