CONTENIDO
Modo AUTOCOMMIT
Por defecto MySQL está configurado con la opción de autocommit activada. Esto significa que cualquier sentencia de manipulación de datos (insert, delete, update) que se ejecute, tiene efecto de manera permanente. Para comprobarlo si abrimos una sesión en MySQL e insertamos datos en una tabla, podemos ver que esos datos están al instante disponibles para el resto de usuarios y de sesiones. Si con nuestro mismo usuario abrimos una nueva sesión, podemos consultar los datos que acabamos de insertar. Sin embargo, hay momentos en los que puede interesar tener el control de ciertas operaciones para que sus cambios sean provisionales (con posibilidad de revertirlos bajo ciertas condiciones). En ese caso, debemos incluir las instrucciones en una TRANSACCIÓN.
Gestión de transacciones
Una transacción en BD es una secuencia de operaciones que se ejecutan como una unidad indivisible. El objetivo principal es garantizar la integridad y consistencia de los datos, de modo que todas las operaciones dentro de la transacción se completen con éxito o se reviertan completamente si alguna falla. El inicio de una transacción desactiva el modo AUTOCOMMIT y es necesario indicar el final de las transacciones como permanentes (commit) o fallidas (rollback).
Comandos
START TRANSACTION: Indica inicio de transacción. Desactiva el modo AUTOCOMMIT. Hace que los cambios sean provisionales pendientes de confirmar.
COMMIT: Confirma los cambios pendientes haciéndolos permanentes. Indica fin de transacción. Retorna a modo AUTOCOMMIT
ROLLBACK: Deshace cambios pendientes. Indica fin de transacción. Retorna a modo AUTOCOMMIT
Sintaxis
START TRANSACTION; -- Inicio de transacción
comandos SQL ... -- Secuencia indivisible de comandos
COMMIT | ROLLBACK; -- Confirma o anula los cambios pendientes
Ejemplo de uso
START TRANSACTION;
INSERT INTO profesores (dni, creditos) VALUES (‘1111’, 6); -- solo ve la inserción esta sesión
COMMIT; -- la inserción se lleva a cabo
START TRANSACTION;
INSERT INTO profesores (dni, creditos) VALUES (‘222’,3); -- solo ve la inserción esta sesión
ROLLBACK; -- la inserción no se lleva a cabo
Las sentencias de definición de datos (CREATE, ALTER, DROP, etc) no tienen posibilidad de rollback. Su ejecución supone un fin de transacción (retorno a autocommit on) y la validación de los cambios pendientes. A efectos prácticos equivale a hacer COMMIT:
START TRANSACTION;
INSERT INTO profesores (dni, creditos) VALUES (‘222’,3);
DROP TABLE asignaturas; -- la inserción anterior se lleva a cabo puesto que DROP ha forzado un COMMIT
ROLLBACK; -- ROLLBACK ya no tiene nada que deshacer