sql >> Base de Datos >  >> RDS >> Mysql

El enigma de las transacciones de MySQL

MySQL pasa el código de error a la persona que llama y, en función de este código de error, la persona que llama es libre de decidir si desea confirmar el trabajo realizado hasta el momento (ignorando el error con este INSERT en particular estado de cuenta) o revertir la transacción.

Esto es diferente a PostgreSQL que siempre aborta la transacción por error y este comportamiento es una fuente de muchos problemas.

Actualización:

Es una mala práctica usar un ROLLBACK incondicional dentro de los procedimientos almacenados.

Los procedimientos almacenados son apilables y las transacciones no, por lo que ROLLBACK dentro de un procedimiento almacenado anidado retrocederá al principio de la transacción, no al estado de ejecución del procedimiento almacenado.

Si desea usar transacciones para restaurar el estado de la base de datos en caso de errores, use SAVEPOINT construcciones y DECLARE HANDLER para retroceder a los puntos de guardado:

CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

Si falla cualquiera de las dos inserciones, se revertirán todos los cambios realizados por el procedimiento y se saldrá.