Signatur
Beschreibung
odbc_commit() beendet eine aktive Transaktion auf einer ODBC-Verbindung, indem alle seit dem letzten Commit oder Rollback vorgenommenen Änderungen dauerhaft gespeichert werden. Die Funktion wird typischerweise eingesetzt, wenn der Autocommit-Modus der ODBC-Verbindung deaktiviert wurde (via odbc_autocommit($odbc, false)).
Der Transaktionsmechanismus ermöglicht es, mehrere Datenbankoperationen atomar durchzuführen: Entweder werden alle Änderungen übernommen (Commit) oder alle verworfen (Rollback). Dies ist besonders wichtig bei zusammenhängenden Operationen, die nur gemeinsam sinnvoll sind, etwa beim Übertragen von Bestelldaten und dem gleichzeitigen Aktualisieren des Lagerbestands.
Im Fehlerfall sollte statt odbc_commit() die Funktion odbc_rollback() aufgerufen werden, um alle Änderungen der laufenden Transaktion rückgängig zu machen. Nach einem erfolgreichen Commit oder Rollback beginnt automatisch eine neue Transaktion, wenn der Autocommit-Modus deaktiviert bleibt.
Nicht alle ODBC-Treiber und Datenbanken unterstützen Transaktionen. Bei Treibern ohne Transaktionsunterstützung kann das Verhalten dieser Funktion undefiniert sein — überprüfe daher die Fähigkeiten deines ODBC-Treibers vorab.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $odbc Pflicht | resource | Eine aktive ODBC-Verbindungsressource, wie sie von odbc_connect() oder odbc_pconnect() zurückgegeben wird. |
Rückgabewert
true zurück, wenn der Commit erfolgreich war. Bei einem Fehler (z. B. keine aktive Transaktion, Verbindungsproblem) wird false zurückgegeben.Beispiele
Einfache Transaktion mit Commit und Rollback
<?php
$odbc = odbc_connect('MeineDSN', 'benutzer', 'passwort');
if (!$odbc) {
die('Verbindung fehlgeschlagen: ' . odbc_errormsg());
}
// Autocommit deaktivieren, um manuelle Transaktionskontrolle zu ermöglichen
odbc_autocommit($odbc, false);
try {
odbc_exec($odbc, "INSERT INTO bestellungen (kunde_id, betrag) VALUES (42, 99.99)");
odbc_exec($odbc, "UPDATE lager SET menge = menge - 1 WHERE artikel_id = 7");
// Alle Änderungen dauerhaft speichern
if (odbc_commit($odbc)) {
echo "Transaktion erfolgreich abgeschlossen.";
} else {
throw new RuntimeException('Commit fehlgeschlagen: ' . odbc_errormsg($odbc));
}
} catch (RuntimeException $e) {
// Im Fehlerfall alle Änderungen rückgängig machen
odbc_rollback($odbc);
echo "Transaktion zurückgerollt: " . $e->getMessage();
} finally {
odbc_close($odbc);
}
Batch-Insert mit manueller Transaktionskontrolle
<?php
$odbc = odbc_connect('MeineDSN', 'benutzer', 'passwort');
odbc_autocommit($odbc, false);
$datensaetze = [
['Anna', 'Schmidt'],
['Max', 'Müller'],
['Lena', 'Braun'],
];
$fehler = false;
foreach ($datensaetze as [$vorname, $nachname]) {
$sql = sprintf(
"INSERT INTO personen (vorname, nachname) VALUES ('%s', '%s')",
odbc_escape_string($vorname),
odbc_escape_string($nachname)
);
if (!odbc_exec($odbc, $sql)) {
$fehler = true;
break;
}
}
if ($fehler) {
odbc_rollback($odbc);
echo "Fehler aufgetreten – alle Einfügungen wurden verworfen.";
} else {
odbc_commit($odbc);
echo "Alle " . count($datensaetze) . " Datensätze erfolgreich gespeichert.";
}
odbc_close($odbc);
// Wichtig · Fallstricke
Autocommit-Modus: Im Standard-Autocommit-Modus wird jede SQL-Anweisung sofort in die Datenbank geschrieben. odbc_commit() hat in diesem Modus keine Wirkung — deaktiviere den Autocommit-Modus zuerst mit odbc_autocommit($odbc, false).
Sicherheit: Stelle sicher, dass bei Fehlern stets odbc_rollback() aufgerufen wird, um inkonsistente Datenbankzustände zu vermeiden. Verwende try-catch-finally-Blöcke, um auch bei unerwarteten Ausnahmen einen Rollback durchzuführen.
Treiberkompatibilität: Nicht alle ODBC-Treiber unterstützen Transaktionen. Prüfe, ob dein Treiber die SQL-Eigenschaft SQL_TXN_CAPABLE unterstützt, bevor du auf Transaktionen setzt.