Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Enigma da transação do MySQL


MySQL passa o código de erro para o chamador e com base neste código de erro o chamador élivre para decidir se deseja confirmar o trabalho feito até o momento (ignorando o erro com este INSERT específico declaração) ou para reverter a transação.

Isso é diferente do PostgreSQL que sempre aborta a transação em caso de erro e esse comportamento é uma fonte de muitos problemas.

Atualização:

É uma má prática usar um ROLLBACK incondicional dentro dos procedimentos armazenados.

Os procedimentos armazenados são empilháveis ​​e as transações não, portanto, um ROLLBACK dentro de um procedimento armazenado aninhado reverterá para o início da transação, não para o estado da execução do procedimento armazenado.

Se você quiser usar transações para restaurar o estado do banco de dados em caso de erros, use SAVEPOINT constrói e DECLARE HANDLER para reverter para os pontos de salvamento:
CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

A falha em qualquer inserção reverterá todas as alterações feitas pelo procedimento e sairá dele.