Transacciones en MySQL

Las transacciones son un conjunto de instrucciones SQL que tienen la cualidad de ejecutarse como una unidad, es decir, o se ejecutan todas o no se ejecuta ninguna. Si una transacción tiene éxito, todas las modificaciones de los datos realizados durante la transacción se guardan en la base de datos. Si una transacción contiene errores los cambios no se guardaran en la base de datos.

En un sistema ideal, las transacciones deberían garantizar todas las propiedades ACID (en la práctica, a veces alguna de estas propiedades se simplifica o debilita con vistas a obtener un mejor rendimiento).

ACID son las siglas de Atomicity, Consistency, Isolation y Durability (Atomicidad, Consistencia, Aislamiento , Durabilidad)
  • Atomicidad. Es la propiedad que asegura que la operación se ha realizado o no, y por lo tanto ante un fallo del sistema no puede quedar a medias.
  • Consistencia. Esta propiedad esta ligada a la integridad referencial, es decir solo se pueden escribir datos válidos respetando los tipos de datos declarados y la integridad referencial.
  • Aislamiento. Asegura que una operación no puede afectar a otras. Con esto se asegura que varias transacciones sobre la misma información sean independientes y no generen ningún tipo de error.
  • Durabilidad. Cuando se completa una transacción con éxito los cambios se vuelven permanentes.
El ejemplo clásico de transacción es una transferencia bancaria, en la que quitamos saldo a una cuenta y lo añadimos en otra. Si no somo capaces de abonar el dinero en la cuenta de destino, no debemos quitarlo de la cuenta de origen.
Para implementar transacciones en MySQL hay que utilizar la versión 5.0.x y el motor de almacenamiento InnoDB.

Una transacción tiene dos finales posibles, COMMIT (se ejecutan todas las instrucciones y guardamos los datos) y ROLLBACK (se produce un error y no se guardan los cambios). Por defecto, MySQL trae activado el modo autocommit, por lo que cuando se realiza una transacción (INSERT, UPDATE o DELETE) esta se confirma automáticamente. Para desactivar esta opción se debe ejecutar el siguiente comando (no recomendado):
> SET AUTOCOMMIT=0;
o también se puede desactivar para una serie de comandos utilizando START TRANSACTION. (Esto es lo recomendado)
> START TRANSACTION;
> .....
> COMMIT;

Hay que tener en cuenta que al realizar una transacción SQL que cuando se realice un INSERT, UPDATE o DELETE se generará un bloqueo sobre la tabla y que otros clientes no pueden acceder esta para escribir. Pero si podrán realizar lecturas, en las que no podrán ver los datos del primer cliente hasta que los mismos sean confirmados.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.