PDO::rollBack

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

PDO::rollBack — Annule une transaction

Description

public function PDO::rollBack(): bool

Annule la transaction courante, initiée par la fonction PDO::beginTransaction().

Si la base de données est en mode autocommit, cette fonction restaurera le mode autocommit aprÚs l'annulation de la transaction.

Quelques bases de donnĂ©es, dont MySQL, exĂ©cuteront automatiquement un COMMIT lorsqu'une requĂȘte de dĂ©finition de langage de base de donnĂ©es (DDL) comme DROP TABLE ou CREATE TABLE est exĂ©cutĂ©e dans une transaction. Ce COMMIT implicite empĂȘchera d'annuler toutes autres modifications faites dans cette transaction.

Liste de paramĂštres

Cette fonction ne contient aucun paramĂštre.

Valeurs de retour

Cette fonction retourne true en cas de succĂšs ou false si une erreur survient.

Erreurs / Exceptions

Une exception PDOException sera lancée si aucune transaction n'est active.

Note: Une exception sera Ă©mise mĂȘme si l'attribut PDO::ATTR_ERRMODE ne vaut pas PDO::ERRMODE_EXCEPTION.

Exemples

Exemple #1 Annulation d'une transaction

L'exemple suivant commence une transaction et exĂ©cute deux requĂȘtes qui modifient la base de donnĂ©es avant d'annuler les modifications. Sur MySQL, cependant, la requĂȘte DROP TABLE validera automatiquement la transaction, donc, aucune des modifications de la transaction ne sera annulĂ©e.

<?php
/* Début d'une transaction, désactivation du mode autocommit */
$dbh->beginTransaction();

/* Modifie le schéma de la base de données ainsi que des données */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'"
);

/* On s'aperçoit d'une erreur et on annule les modifications */
$dbh->rollBack();

/* La connexion à la base de données revient en mode autocommit */
?>

Voir aussi

add a note

User Contributed Notes 3 notes

up
52
JonasJ ¶
18 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
13
brian at diamondsea dot com ¶
18 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
6
Petros Giakouvakis ¶
15 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;