Transacciones con MySQL InnoDB y PHP

Esta vez mostrare como ejecutar transacciones utilizando el motor InnoDB de MySql y el lenguaje PHP.

Una transacción en un Sistema de Gestión de Bases de Datos (SGBD), es un conjunto de órdenes que se ejecutan formando una unidad de trabajo, es decir, en forma indivisible o atómica.

En ocasiones requerimos guardar o realizar alguna modificación a la base de datos y es de suma importancia que todas las instrucciones SQL se ejecuten con éxito para no generar inconsistencias en la base de datos un ejemplo seria el siguiente:

 En un banco cuando se realiza una transferencia de una cuenta a otra  cuando se realiza una transferencia, esta acción requiere de dos movimientos el primero decrementa el saldo de la cuenta origen y el segundo incrementa el saldo de la cuenta destino. Para garantizar integridad de la información es decir, para que no aparezca o desaparezca dinero, se debe garantizar que ambas acciones se realicen con éxito de lo contrario que no se realice ninguna acción.

Con esta breve explicación de para que nos sirve una transacción comenzamos con el ejercicio. En InnoDB toda la actividad del usuario se produce dentro de una transacción  es decir cada sentencia SQL  representa una transacción a la base de datos.

De forma predeterminada MySql inicia una conexión a la base de datos con AUTOCOMMIT habilitado, lo que esto significa que cuando  se ejecuta la sentencia SQL implícitamente se ejecuta un COMMIT haciendo permanente los cambios en la base de datos.

Si deshabilitamos AUTOCOMMIT significaría que tendríamos abierta la transacción y esta finalizará cuando se ejecute una sentencia COMMIT para que los cambios se hagan permanentes o ROLLBACK, para dejar la base de datos tal como estaba al inicio de la transacción de esta forma la base no sufre ningún cambio. Después de esto iniciaría una nueva transacción.

Aquí les dejo un ejemplo con sus comentarios correspondientes.

 

<?php
//Establecemos los datos para la conexion a la base
$servidor = “localhost”;
$usuario = “root”;
$password = “”;
$BaseDatos =”base”;

//Nos conectamos a la base
$conexion = new mysqli($servidor, $usuario, $password, $BaseDatos);

//Ejecutamos un select y contamos las filas que tiene la tabla
$result = $conexion->query(“select * from clientes”);
echo “Num de filas al iniciar: “.$result->num_rows. “</br>”;

// deshabilitamos el autocommit para llevar a cabo la transacción
//con varias sentencias
$conexion->autocommit(false);

// Insertamos dos registros en la base de datos
$conexion->query(“INSERT INTO clientes (id,nombre) VALUES(1,’Juan’);”);
$conexion->query(“INSERT INTO clientes (id,nombre) VALUES(2,’Jose’);”);

// Ejecutamos el commit, esto hace que los cambios sean permanentes y se
// vuelven visibles para los otros usuarios.
$conexion->commit();

// Ejecutamos un select y contamos las filas que tiene la tabla
$result = $conexion->query(“select * from clientes”);
echo “Num de filas despues de ejecutar el commit: “.$result->num_rows.”</br>”;

// Insertamos dos registros en la base de datos
$conexion->query(“INSERT INTO clientes (id,nombre) VALUES(3,’Ana’);”);
$conexion->query(“INSERT INTO clientes (id,nombre) VALUES(4,’Sofia’);”);

// Ejecutamos un select y contamos las filas que tiene la tabla
$result = $conexion->query(“select * from clientes”);
echo “Numero de filas despues de insertar dos registros mas:”. $result->num_rows.”</br>”;

// Ejecutamos el rollback para deshacer los cambios.
$conexion->rollback();

// Ejecutamos un select y contamos las filas que tiene la tabla
$result = $conexion->query(“select * from clientes”);
?>

Un comentario en “Transacciones con MySQL InnoDB y PHP”

  1. Chato dice:

    Buena explicación!

Deja un comentario