Las transacciones en MySQL permiten ejecutar un conjunto de consultas SQL de manera atómica, es decir, todas las operaciones dentro de la transacción deben completarse exitosamente o ninguna tendrá efecto (ACID: Atomicidad, Consistencia, Aislamiento, Durabilidad).
Para manejar transacciones en MySQL, se usa:
START TRANSACTION
o BEGIN
para iniciar.COMMIT
para confirmar los cambios.ROLLBACK
para deshacer los cambios en caso de error.Este ejemplo transfiere dinero entre cuentas bancarias y garantiza que la operación sea atómica:
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 500 WHERE id_cuenta = 1;
UPDATE cuentas SET saldo = saldo + 500 WHERE id_cuenta = 2;
COMMIT; -- Confirma los cambios
💡 Si ocurre un error antes del COMMIT
, los cambios no se aplican.
ROLLBACK
para Deshacer CambiosSi detectamos un problema, podemos cancelar la transacción con ROLLBACK
:
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 500 WHERE id_cuenta = 1;
UPDATE cuentas SET saldo = saldo + 500 WHERE id_cuenta = 2;
-- Simulando un error
IF (SELECT saldo FROM cuentas WHERE id_cuenta = 1) < 0 THEN
ROLLBACK; -- Revierte todos los cambios
ELSE
COMMIT; -- Confirma los cambios
END IF;
💡 Si la cuenta queda en negativo, la transacción se cancela.
SAVEPOINT
para Revertir ParcialmentePuedes definir puntos de guardado dentro de una transacción para deshacer solo parte de los cambios.
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - 500 WHERE id_cuenta = 1;
SAVEPOINT despues_de_debito; -- Guardamos un punto
UPDATE cuentas SET saldo = saldo + 500 WHERE id_cuenta = 2;
-- Simulamos un error en la segunda actualización
ROLLBACK TO despues_de_debito; -- Revierte solo desde este punto
COMMIT;
💡 La primera actualización se mantiene, pero la segunda se revierte.
Un procedimiento almacenado con transacción y control de errores:
DELIMITER $$
CREATE PROCEDURE TransferenciaBancaria(
IN cuenta_origen INT,
IN cuenta_destino INT,
IN monto DECIMAL(10,2)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Error en la transacción';
END;
START TRANSACTION;
UPDATE cuentas SET saldo = saldo - monto WHERE id_cuenta = cuenta_origen;
UPDATE cuentas SET saldo = saldo + monto WHERE id_cuenta = cuenta_destino;
COMMIT;
END$$
DELIMITER ;
💡 Si algo falla en la transferencia, la transacción se revierte y devuelve un error.
✅ Usa transacciones para operaciones críticas como pagos o transferencias.
✅ Siempre maneja errores con ROLLBACK
para evitar datos inconsistentes.
✅ Utiliza SAVEPOINT
si necesitas revertir parcialmente.
✅ Verifica que la tabla use un motor que soporte transacciones (InnoDB
) con:
SHOW TABLE STATUS WHERE Name = 'nombre_tabla';