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.