Signatur
Beschreibung
db2_rollback() verwirft alle ausstehenden Änderungen der aktuellen Transaktion auf einer IBM Db2-Datenbankverbindung. Die Funktion wird typischerweise im Fehlerfall eingesetzt, um sicherzustellen, dass ein inkonsistenter Datenbankzustand vermieden wird – beispielsweise wenn ein Teil einer mehrteiligen Transaktion fehlschlägt.
Die Funktion setzt voraus, dass die Verbindung im manuellen Transaktionsmodus betrieben wird. Diesen Modus aktiviert man mit db2_autocommit($conn, DB2_AUTOCOMMIT_OFF). Im Standard-Autocommit-Modus wird jede Anweisung sofort festgeschrieben, sodass db2_rollback() dort keine Wirkung hat.
Ein typisches Muster ist das Einschließen von mehreren zusammenhängenden db2_exec()- oder db2_execute()-Aufrufen in einem try/catch-Block: Bei Erfolg wird db2_commit() aufgerufen, im Fehlerfall db2_rollback(). Damit bleiben zusammengehörige Datensätze immer konsistent.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $connection Pflicht | resource | Eine aktive IBM Db2-Datenbankverbindung, wie sie von db2_connect() oder db2_pconnect() zurückgegeben wird. |
Rückgabewert
true zurück, wenn der Rollback erfolgreich durchgeführt wurde, andernfalls false.Beispiele
Rollback bei fehlgeschlagener Transaktion
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'secret');
if ($conn) {
// Autocommit deaktivieren
db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);
$sql1 = "INSERT INTO orders (customer_id, total) VALUES (42, 199.99)";
$sql2 = "UPDATE inventory SET stock = stock - 1 WHERE product_id = 7";
$result1 = db2_exec($conn, $sql1);
$result2 = db2_exec($conn, $sql2);
if ($result1 && $result2) {
db2_commit($conn);
echo "Transaktion erfolgreich abgeschlossen.";
} else {
db2_rollback($conn);
echo "Fehler – Transaktion wurde zurückgerollt: " . db2_stmt_errormsg();
}
db2_close($conn);
}
?>
Rollback mit try/catch-Muster
<?php
$conn = db2_connect('SAMPLE', 'db2user', 'secret');
if (!$conn) {
die('Verbindung fehlgeschlagen: ' . db2_conn_errormsg());
}
db2_autocommit($conn, DB2_AUTOCOMMIT_OFF);
try {
$stmtA = db2_exec($conn, "DELETE FROM sessions WHERE expired = 1");
if (!$stmtA) {
throw new RuntimeException('DELETE fehlgeschlagen: ' . db2_stmt_errormsg());
}
$stmtB = db2_exec($conn, "INSERT INTO audit_log (action) VALUES ('session_cleanup')");
if (!$stmtB) {
throw new RuntimeException('INSERT fehlgeschlagen: ' . db2_stmt_errormsg());
}
db2_commit($conn);
echo "Bereinigung erfolgreich committed.";
} catch (RuntimeException $e) {
db2_rollback($conn);
echo "Rollback durchgeführt: " . $e->getMessage();
} finally {
db2_close($conn);
}
?>
// Wichtig · Fallstricke
Autocommit beachten: db2_rollback() hat nur eine Wirkung, wenn Autocommit zuvor mit db2_autocommit($conn, DB2_AUTOCOMMIT_OFF) deaktiviert wurde. Im Standard-Autocommit-Modus werden Änderungen sofort festgeschrieben und können nicht mehr zurückgerollt werden.
Savepoints: IBM Db2 unterstützt Savepoints. Soll nur ein Teil einer Transaktion zurückgerollt werden, kann über db2_exec($conn, 'ROLLBACK TO SAVEPOINT mein_savepoint') ein partielles Rollback erfolgen.
Persistente Verbindungen: Bei Verwendung von db2_pconnect() (persistente Verbindungen) kann es vorkommen, dass eine vorherige Transaktion noch offen ist. Es empfiehlt sich daher, nach dem Aufbau einer persistenten Verbindung vorsorglich db2_rollback() aufzurufen.