PHP 8.5.0 Alpha 1 available for testing

PDO::rollBack

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

PDO::rollBack Anula una transacción

Descripción

public PDO::rollBack(): bool

Anula la transacción actual, iniciada por la función PDO::beginTransaction().

Si la base de datos está en modo autocommit, esta función restaurará el modo autocommit después de la anulación de la transacción.

Algunas bases de datos, incluyendo MySQL, ejecutarán automáticamente un COMMIT cuando se ejecute una consulta de definición de lenguaje de base de datos (DDL) como DROP TABLE o CREATE TABLE en una transacción. Este COMMIT implícito impedirá anular cualquier otra modificación realizada en esta transacción.

Parámetros

Esta función no tiene parámetros.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Errores/Excepciones

Se lanzará una excepción PDOException si no hay ninguna transacción activa.

Nota: Se emite una excepción inclusi cuando el atributo PDO::ATTR_ERRMODE no es PDO::ERRMODE_EXCEPTION.

Ejemplos

Ejemplo #1 Anulación de una transacción

El siguiente ejemplo comienza una transacción y ejecuta dos consultas que modifican la base de datos antes de anular las modificaciones. En MySQL, sin embargo, la consulta DROP TABLE validará automáticamente la transacción, por lo que ninguna de las modificaciones de la transacción será anulada.

<?php
/* Inicio de una transacción, desactivación del modo autocommit */
$dbh->beginTransaction();

/* Modifica el esquema de la base de datos así como los datos */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'"
);

/* Se detecta un error y se anulan las modificaciones */
$dbh->rollBack();

/* La conexión a la base de datos vuelve al modo autocommit */
?>

Ver también

add a note

User Contributed Notes 3 notes

up
53
JonasJ
17 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
17 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
14 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;
To Top