W3docs

rollback

Aprende a usar mysqli_rollback() en PHP para deshacer cambios en transacciones MySQL y mantener la integridad de los datos.

Introducción

MySQLi es la extensión de PHP utilizada para comunicarse con bases de datos MySQL. La función mysqli_rollback() (o el método $mysqli->rollback() en estilo orientado a objetos) deshace todos los cambios realizados desde que comenzó una transacción. Esta página explica cuándo y por qué la necesitas, cómo encaja junto a mysqli_commit(), y muestra ejemplos ejecutables tanto en estilo procedimental como orientado a objetos.

Si eres nuevo en la extensión, comienza con PHP MySQLi y conectarse a MySQL.

¿Qué es la función MySQLi Rollback?

Una transacción es un grupo de operaciones de base de datos tratadas como una sola unidad de trabajo: o todas se aplican, o ninguna lo hace. mysqli_rollback() es lo que hace posible "ninguna de ellas" — descarta todos los cambios realizados desde que comenzó la transacción y devuelve la base de datos a su estado anterior.

El ejemplo clásico es una transferencia de dinero. Restar de una cuenta y añadir a otra deben ocurrir ambas; si la segunda consulta falla, no puedes dejar la primera aplicada. Hacer un rollback garantiza que las cuentas permanezcan equilibradas.

bool mysqli_rollback(mysqli $mysql, int $flags = 0, ?string $name = null)

Devuelve true en caso de éxito y false en caso de error. El parámetro opcional $name te permite hacer rollback hasta un savepoint con nombre en lugar de toda la transacción.

Autocommit: por qué necesitas transacciones en absoluto

De forma predeterminada, MySQL funciona en modo autocommit, lo que significa que cada instrucción individual se confirma inmediatamente y de forma permanente — no hay nada que revertir. Llamar a mysqli_begin_transaction() desactiva el autocommit durante la duración de la transacción, por lo que tus cambios permanecen pendientes hasta que explícitamente llames a commit() o rollback(). Consulta autocommit para ver el comportamiento completo.

Cómo funciona el flujo de trabajo del rollback

Una transacción completa sigue cuatro pasos:

  1. Conectar al servidor.
  2. Iniciar una transacción con mysqli_begin_transaction().
  3. Ejecutar las consultas.
  4. Confirmar si todo tuvo éxito, o revertir si algo falló.

Aquí hay un ejemplo procedimental completo:

<?php
// Create a connection to the MySQL server
$conn = mysqli_connect("localhost", "username", "password", "database");

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// Start a transaction
mysqli_begin_transaction($conn);

// Execute queries and make changes to the database
$insert = mysqli_query($conn, "INSERT INTO `my_table` (column1, column2) VALUES ('value1', 'value2')");
$update = mysqli_query($conn, "UPDATE `my_table` SET column1 = 'new_value' WHERE id = 1");

// Check if queries succeeded
if ($insert && $update) {
    // Commit the transaction if all queries succeed
    mysqli_commit($conn);
    echo "Transaction committed successfully.";
} else {
    // Rollback the changes if any query fails
    mysqli_rollback($conn);
    echo "Transaction failed and rolled back: " . mysqli_error($conn);
}

mysqli_close($conn);
?>

Se inicia una transacción, se ejecutan dos consultas, y el resultado determina el desenlace: confirmar en caso de éxito, revertir en caso de error. Ten en cuenta que mysqli_query() solo devuelve false cuando una consulta falla a nivel SQL — no lanza excepciones, por lo que debes comprobar el valor de retorno tú mismo a menos que habilites las excepciones (se muestra a continuación).

Estilo orientado a objetos con sentencias preparadas

La mayoría del código en producción utiliza la API orientada a objetos junto con sentencias preparadas, que previenen la inyección SQL separando la consulta de sus datos. Activar el modo de informe de excepciones te permite envolver toda la transacción en un único try/catch y hacer rollback desde un solo lugar:

<?php
// Throw exceptions on any MySQLi error instead of returning false
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$mysqli = new mysqli("localhost", "username", "password", "database");

$mysqli->begin_transaction();

try {
    $stmt = $mysqli->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
    $stmt->bind_param("di", $amount, $fromId);
    $amount = 100.00;
    $fromId = 1;
    $stmt->execute();

    $stmt = $mysqli->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
    $stmt->bind_param("di", $amount, $toId);
    $toId = 2;
    $stmt->execute();

    // Both updates succeeded — make them permanent
    $mysqli->commit();
    echo "Transfer committed.";
} catch (mysqli_sql_exception $e) {
    // Anything threw — undo everything
    $mysqli->rollback();
    echo "Transfer failed and rolled back: " . $e->getMessage();
}

$mysqli->close();
?>

Dado que MYSQLI_REPORT_STRICT hace que las sentencias fallidas lancen mysqli_sql_exception, nunca tienes que verificar el valor de retorno de cada consulta — el bloque catch maneja todos los caminos de error. Consulta excepciones en PHP para más información sobre try/catch.

Revertir hasta un savepoint

Un savepoint es un marcador con nombre dentro de una transacción. Revertir hasta él deshace solo el trabajo realizado después del savepoint, dejando los cambios anteriores pendientes. Esto es útil cuando parte de una transacción es opcional:

<?php
$mysqli->begin_transaction();

$mysqli->query("INSERT INTO orders (customer_id) VALUES (5)");
$mysqli->savepoint("after_order");

$mysqli->query("INSERT INTO order_items (order_id, sku) VALUES (LAST_INSERT_ID(), 'BAD')");

// Undo only the order_items insert; the order row remains pending
$mysqli->rollback(0, "after_order");

$mysqli->commit(); // commits the order without the bad item
?>

Casos de uso de la función MySQLi Rollback

La función MySQLi Rollback es útil para una variedad de escenarios, entre ellos:

1. Integridad de datos

Mantiene la consistencia de la base de datos revirtiendo actualizaciones parciales cuando falla una operación, garantizando que los registros permanezcan válidos.

2. Manejo de errores

Proporciona un mecanismo de recuperación limpio. Cuando ocurre un fallo, revertir los cambios evita datos huérfanos o corruptos, a la vez que permite a la aplicación registrar y mostrar mensajes de error significativos.

3. Gestión de transacciones

Simplifica el control del flujo de trabajo al permitir a los desarrolladores abortar una secuencia de operaciones dependientes y reiniciar o abandonar la transacción de forma segura sin limpieza manual.

Ventajas de la función MySQLi Rollback

La función MySQLi Rollback ofrece varios beneficios técnicos para los desarrolladores PHP:

1. Atomicidad

Garantiza que un grupo de operaciones de base de datos o todas tengan éxito o todas fallen juntas, evitando actualizaciones parciales que podrían corromper los datos.

2. Depuración simplificada

Cuando falla una transacción, revertir los cambios restaura la base de datos a su estado anterior, facilitando el aislamiento y la corrección de la consulta problemática sin limpieza manual.

3. Optimización del rendimiento

Agrupar múltiples consultas en una sola transacción reduce la sobrecarga de confirmar los cambios individualmente, lo que lleva a operaciones de base de datos más rápidas.

Errores comunes

  • El motor de almacenamiento importa. Solo los motores transaccionales soportan el rollback. El InnoDB predeterminado de MySQL sí lo hace; el antiguo motor MyISAM ignora silenciosamente las transacciones, por lo que un rollback no cambia nada en ese caso. Asegúrate de que tus tablas sean InnoDB.
  • Las sentencias DDL confirman automáticamente. Sentencias como CREATE TABLE, ALTER TABLE y DROP TABLE confirman implícitamente la transacción actual en MySQL — no puedes revertirlas. Mantén los cambios de esquema fuera de las transacciones que esperas deshacer.
  • Revertir exactamente una vez. Después de un commit() o un rollback() completo, la transacción ha terminado. Comienza una nueva antes de ejecutar más trabajo transaccional.
  • Las desconexiones revierten automáticamente. Si se pierde la conexión a mitad de una transacción, MySQL revierte automáticamente — el trabajo no confirmado nunca queda aplicado a medias.

Conclusión

La función mysqli_rollback() es esencial para los desarrolladores PHP que necesitan revertir cambios en la base de datos durante una transacción. Garantiza la integridad de los datos, simplifica la gestión de transacciones y mejora el manejo de errores. Siguiendo los pasos de esta guía, los desarrolladores pueden implementar rollbacks de forma segura para mantener operaciones de base de datos confiables.

Práctica

Práctica
¿Cuál es el propósito de la función rollback() en PHP?
¿Cuál es el propósito de la función rollback() en PHP?
Was this page helpful?