PDO::rollBack

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::rollBackMacht eine Transaktion rückgängig (Rollback)

Beschreibung

public PDO::rollBack(): bool

Macht die aktuelle durch PDO::beginTransaction() gestartete Transaktion rückgängig.

Falls die Datenbank auf den Autocommit-Modus eingestellt war, wird er wiederhergestellt, nachdem die Transaktion zurückgesetzt wurde.

Wenn im Rahmen einer Transaktion eine DDL- (Database Definition Language) Anweisung wie DROP TABLE oder CREATE TABLE ausgeführt wird, geben einige Datenbanken, darunter auch MySQL, ein implizites COMMIT aus. Durch das implizite COMMIT wird verhindert, dass weitere im Rahmen der Transaktion vorgenommene Änderungen rückgängig gemacht werden können.

Parameter-Liste

Diese Funktion besitzt keine Parameter.

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Fehler/Exceptions

Wenn es keine aktive Transaktion gibt, wird eine PDOException ausgelöst.

Hinweis: Eine Exception wird auch dann ausgelöst, wenn das Attribut PDO::ATTR_ERRMODE nicht PDO::ERRMODE_EXCEPTION ist.

Beispiele

Beispiel #1 Rückgängigmachen einer Transaktion

Im folgenden Beispiel wird eine Transaktion gestartet und es werden zwei Anweisungen ausgeführt, die die Datenbank verändern, bevor die Änderungen rückgängig gemacht werden. Bei MySQL wird die Transaktion jedoch durch die Anweisung DROP TABLE automatisch bestätigt, sodass keine der Änderungen dieser Transaktion rückgängig gemacht wird.

<?php
/* Starten einer Transaktion, wobei Autocommit deaktiviert wird */
$dbh->beginTransaction();

/* Ändern des Datenbankschemas und der Daten */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'"
);

/* Erkennen eines Fehlers und Zurücknehmen der Änderungen */
$dbh->rollBack();

/* Die Datenbankverbindung ist nun wieder im Autocommit-Modus */
?>

Siehe auch

add a note

User Contributed Notes 4 notes

up
53
JonasJ
16 years ago
Just a quick (and perhaps obvious) note for MySQL users;

Don't scratch your head if it isn't working if you are using a MyISAM table to test the rollbacks with.

Both rollBack() and beginTransaction() will return TRUE but the rollBack will not happen.

Convert the table to InnoDB and run the test again.
up
11
brian at diamondsea dot com
16 years ago
Here is a way of testing that your transaction has started when using MySQL's InnoDB tables. It will fail if you are using MySQL's MyISAM tables, which do not support transactions but will also not return an error when using them.

<?
// Begin the transaction
$dbh->beginTransaction();

// To verify that a transaction has started, try to create an (illegal for InnoDB) nested transaction.
// If it works, the first transaction did not start correctly or is unsupported (such as on MyISAM tables)
try {
$dbh->beginTransaction();
die('Cancelling, Transaction was not properly started');
} catch (PDOException $e) {
print "Transaction is running (because trying another one failed)\n";
}
?>
up
5
Petros Giakouvakis
13 years ago
Should anyone reading this be slightly panicked because they just discovered that their MySQL tables are MyIsam and not InnoDb, don't worry... You can very easily change the storage engine using the following query:

ALTER TABLE your_table_name ENGINE = innodb;
up
-7
linfo2003 at libero dot it
16 years ago
Since "It is an error to call this method if no transaction is active", it could be useful (even if not indispensable) to have a method which returns true if a transaction is active.

try {
$dbh->beginTransaction();
...
} catch (PDOException $e) {
if ($dbh->isTransactionActive()) // this function does NOT exist
$dbh->rollBack();
...
}

In the meanwhile, I'm using this code:

...
} catch (PDOException $e) {
try { $dbh->rollBack(); } catch (Exception $e2) {}
...
}

It's not so chic, but it works fine.
To Top