Signatur
Beschreibung
odbc_rollback() wird verwendet, um eine aktive ODBC-Transaktion zu verwerfen. Alle Datenbankoperationen (INSERT, UPDATE, DELETE usw.), die nach dem letzten odbc_commit() bzw. nach dem Deaktivieren des Auto-Commit-Modus ausgeführt wurden, werden vollständig zurückgerollt, als wären sie nie ausgeführt worden.
Damit odbc_rollback() sinnvoll eingesetzt werden kann, muss der Auto-Commit-Modus der ODBC-Verbindung zuvor mit odbc_autocommit($odbc, false) deaktiviert worden sein. Im Auto-Commit-Modus wird jede SQL-Anweisung sofort und automatisch festgeschrieben, sodass ein Rollback keine Wirkung mehr hätte.
Typischer Einsatz ist ein try-catch-Block, in dem bei einem Fehler odbc_rollback() aufgerufen wird, um die Datenkonsistenz zu gewährleisten. Dadurch werden keine halbfertigen Datenbankzustände hinterlassen, die zu Inkonsistenzen führen könnten.
- Stets in Kombination mit
odbc_autocommit()undodbc_commit()verwenden. - Nicht alle ODBC-Datenbanktreiber und -Backends unterstützen Transaktionen vollständig.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $odbc Pflicht | resource | Eine gültige ODBC-Verbindungsressource, die zuvor mit odbc_connect() oder odbc_pconnect() geöffnet wurde. |
Rückgabewert
true zurück, wenn der Rollback erfolgreich war, andernfalls false — beispielsweise wenn die Verbindung ungültig ist oder der Treiber keine Transaktionen unterstützt.Beispiele
Transaktion mit Rollback bei Fehler
<?php
$odbc = odbc_connect('MeineDSN', 'benutzer', 'passwort');
if (!$odbc) {
die('Verbindung fehlgeschlagen.');
}
// Auto-Commit deaktivieren
odbc_autocommit($odbc, false);
try {
$result1 = odbc_exec($odbc, "INSERT INTO bestellungen (produkt_id, menge) VALUES (42, 5)");
if (!$result1) {
throw new RuntimeException('Fehler beim Einfügen der Bestellung.');
}
$result2 = odbc_exec($odbc, "UPDATE lager SET menge = menge - 5 WHERE produkt_id = 42");
if (!$result2) {
throw new RuntimeException('Fehler beim Aktualisieren des Lagerbestands.');
}
// Alles erfolgreich — Transaktion festschreiben
odbc_commit($odbc);
echo 'Transaktion erfolgreich abgeschlossen.';
} catch (RuntimeException $e) {
// Fehler aufgetreten — alle Änderungen zurückrollen
odbc_rollback($odbc);
echo 'Transaktion abgebrochen: ' . $e->getMessage();
} finally {
odbc_close($odbc);
}
Rollback nach manueller Fehlerprüfung
<?php
$odbc = odbc_connect('MeineDSN', 'user', 'pass');
odbc_autocommit($odbc, false);
$ok = odbc_exec($odbc, "DELETE FROM temp_log WHERE erstellt_am < '2023-01-01'");
if ($ok) {
odbc_commit($odbc);
echo 'Alte Einträge erfolgreich gelöscht.';
} else {
odbc_rollback($odbc);
echo 'Löschvorgang fehlgeschlagen, Rollback durchgeführt.';
}
odbc_close($odbc);
// Wichtig · Fallstricke
Auto-Commit beachten: Wenn Auto-Commit aktiv ist (Standardeinstellung), hat odbc_rollback() keine Wirkung, da jede Anweisung bereits sofort festgeschrieben wird. Stets zuerst odbc_autocommit($odbc, false) aufrufen.
Treiber-Kompatibilität: Nicht alle ODBC-Backends unterstützen Transaktionen (z. B. bestimmte CSV- oder Text-Treiber). Prüfen Sie die Dokumentation des verwendeten Datenbanktreibers, bevor Sie auf Transaktionssupport vertrauen.
Ressourcenfreigabe: Nach einem Rollback sollte der Verbindungszustand mit odbc_autocommit() ggf. zurückgesetzt und die Verbindung ordentlich mit odbc_close() geschlossen werden, um Ressourcenlecks zu vermeiden.