Mysql
 sql >> Base de données >  >> RDS >> Mysql

L'énigme des transactions MySQL

MySQL transmet le code d'erreur à l'appelant et sur la base de ce code d'erreur, l'appelant est libre de décider s'il veut valider le travail effectué jusqu'à présent (en ignorant l'erreur avec ce INSERT particulier déclaration) ou pour annuler la transaction.

Ceci est différent de PostgreSQL qui interrompt toujours la transaction en cas d'erreur et ce comportement est source de nombreux problèmes.

Mise à jour :

C'est une mauvaise pratique d'utiliser un ROLLBACK inconditionnel à l'intérieur des procédures stockées.

Les procédures stockées sont empilables et les transactions ne le sont pas, donc un ROLLBACK dans une procédure stockée imbriquée reviendra au tout début de la transaction, et non à l'état d'exécution de la procédure stockée.

Si vous souhaitez utiliser des transactions pour restaurer l'état de la base de données en cas d'erreur, utilisez SAVEPOINT constructions et DECLARE HANDLER pour revenir aux points de sauvegarde :

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

L'échec de l'une ou l'autre des insertions annulera toutes les modifications apportées par la procédure et la quittera.