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