Las transacciones de bases de datos permiten agrupar sentencias (por ejemplo SQL) en bloques, que van a ser ejecutados simultáneamente de tal forma que podamos evaluar si alguna de las sentencias ha fallado y de ser así poder deshacer los cambios en el momento sin alterar de forma alguna la base de datos.

¿ Como funcionan las transacciones MySQL ?

Cada transacción puede verse como una función, y dentro de ella puede haber tantas instrucciones como sea necesario.

START TRANSACTION;
    UPDATE users SET name='jane' WHERE id=1;
    UPDATE users SET name='jhon' WHERE id=2;
COMMIT; / ROLLBACK;

En este caso tenemos dos sentencias, cada una de ellas para editar un registro, MySQL las evalúa y las guarda en un estado temporal y posteriormente son ejecutadas o desechadas con los comandos COMMIT o ROLLBACK.

Transacciones de base de datos con MySQL en PHP

Cuando trabajamos con PHP podemos hacer uso de sus funciones para implementar las transacciones de bases de datos en nuestros proyectos. Veamos un pequeño ejemplo

Primero debemos crear la conexión a la base de datos

$conex = new mysqli("localhost", "root", "pass", "database");

Ahora digamos que en nuestra base de datos tenemos una tabla llamada «users» con varios usuarios registrados. vamos a agregar un nuevo usuario y editar uno existente en la misma transacción

$conex->autocommit(false);

$conex->query("INSERT INTO users (name) VALUES ('marcus')");

$conex->query("UPDATE users SET name = 'jane' WHERE 'id' = 39 ");

$conex->commit();

Al cambiar el autocommit a «false» estamos indicando que queremos enviar los cambios de forma manual que es justo lo que hacemos al finall con commit().

Evaluando las transacciones

En el bloque anterior simplemente estamos ejecutando todas las transacciones sin importar si una o varias de ellas hayan fallado, la ventaja de su uso radica justamente en la capacidad de desechar todos los cambios en caso de que esto ocurra para evitar inconsistencias. vamos a refactorizar un poco el código.

$conex->autocommit(false);

try {
    $conex->query("INSERT INTO users (name) VALUES ('marcus')");
    $conex->query("UPDATE users SET name = 'jane' WHERE 'id' = 39 ");
    $conex->commit();
} catch (Exception $e) {
    $conex->rollback();
    echo 'Something fails: ',  $e->getMessage(), "\n";
}

De esta forma si se encuentra un problema en una de las sentencias se captura una excepción y se hace rollback de la transacción de lo contrario se enviarán los cambios a la base de datos.

Lecturas relacionadas

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.