Start · Sprachen · PHP · Referenz · oci_commit

oci_commit

Funktion

Bestätigt alle ausstehenden Änderungen der aktuellen Datenbanktransaktion in einer Oracle-Verbindung dauerhaft.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_commit(resource $connection): bool

Beschreibung

oci_commit() schreibt alle seit dem letzten Commit (oder seit Verbindungsbeginn) vorgenommenen DML-Operationen (INSERT, UPDATE, DELETE) dauerhaft in die Oracle-Datenbank. Erst nach einem erfolgreichen Commit sind die Änderungen für andere Datenbankverbindungen sichtbar.

Oracle arbeitet standardmäßig nicht im Autocommit-Modus. Das bedeutet, dass jede Änderung explizit mit oci_commit() bestätigt werden muss, damit sie dauerhaft gespeichert wird. Bei einem Fehler kann die Transaktion mit oci_rollback() rückgängig gemacht werden.

Sinnvoll ist der explizite Einsatz von oci_commit() immer dann, wenn mehrere zusammengehörige SQL-Operationen atomar ausgeführt werden sollen – zum Beispiel beim gleichzeitigen Anlegen eines Kunden und seiner Bestelldaten. So wird sichergestellt, dass entweder alle oder keine der Änderungen in die Datenbank übernommen werden.

Wird die Verbindung geschlossen (z. B. durch oci_close()), ohne vorher einen Commit durchzuführen, wird die Transaktion implizit zurückgerollt. Bei persistenten Verbindungen hingegen bleibt der Transaktionsstatus unter Umständen erhalten – hier ist besondere Vorsicht geboten.

Parameter

Name Typ Default Beschreibung
$connection Pflicht resource Eine gültige Oracle-Verbindungsressource, die mit oci_connect(), oci_pconnect() oder oci_new_connect() erstellt wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, oder false wenn ein Fehler aufgetreten ist (z. B. ungültige Verbindungsressource oder Datenbankfehler). Im Fehlerfall kann oci_error() zur Fehleranalyse genutzt werden.

Beispiele

Einfacher Commit nach einem INSERT

<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XE');

if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

$sql = "INSERT INTO kunden (id, name) VALUES (1, 'Max Mustermann')";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt, OCI_NO_AUTO_COMMIT); // Autocommit deaktivieren

// Commit durchführen
if (oci_commit($conn)) {
    echo "Transaktion erfolgreich bestätigt.";
} else {
    $e = oci_error($conn);
    echo "Fehler beim Commit: " . htmlentities($e['message']);
}

oci_free_statement($stmt);
oci_close($conn);
Transaktion erfolgreich bestätigt.

Transaktionskontrolle mit Rollback bei Fehler

<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XE');

if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

try {
    $stmt1 = oci_parse($conn, "INSERT INTO bestellungen (id, kunde_id, betrag) VALUES (101, 1, 250.00)");
    $ok1 = oci_execute($stmt1, OCI_NO_AUTO_COMMIT);

    $stmt2 = oci_parse($conn, "UPDATE konten SET guthaben = guthaben - 250.00 WHERE kunde_id = 1");
    $ok2 = oci_execute($stmt2, OCI_NO_AUTO_COMMIT);

    if ($ok1 && $ok2) {
        oci_commit($conn);
        echo "Bestellung und Kontoaktualisierung erfolgreich gespeichert.";
    } else {
        throw new RuntimeException('Eine SQL-Operation ist fehlgeschlagen.');
    }
} catch (RuntimeException $e) {
    oci_rollback($conn);
    echo "Fehler: " . $e->getMessage() . " – Transaktion wurde zurückgerollt.";
} finally {
    oci_free_statement($stmt1);
    oci_free_statement($stmt2);
    oci_close($conn);
}
Bestellung und Kontoaktualisierung erfolgreich gespeichert.

// Wichtig · Fallstricke

Persistente Verbindungen: Bei der Verwendung von oci_pconnect() (persistente Verbindungen) kann ein nicht abgeschlossener Transaktionsstatus aus einer vorherigen Anfrage erhalten bleiben. Es empfiehlt sich, zu Beginn jeder Anfrage einen expliziten Rollback durchzuführen, um einen sauberen Ausgangsstatus zu gewährleisten.

OCI_NO_AUTO_COMMIT: Damit oci_commit() wie erwartet funktioniert, müssen SQL-Anweisungen mit dem Flag OCI_NO_AUTO_COMMIT (oder dem älteren Alias OCI_DEFAULT) in oci_execute() ausgeführt werden. Andernfalls wird jede Anweisung sofort automatisch committed.

DDL-Anweisungen: Oracle führt vor und nach DDL-Anweisungen (z. B. CREATE TABLE, ALTER TABLE) automatisch einen impliziten Commit durch. Das kann laufende Transaktionen unerwartet beenden.