Criando Stored PROCEDURE com TRANSACTION – ROLLBACK | COMMIT

Esta ideia foi retirada deste link.

Imagine que temos que realizar uma serie de melhorias em um sistema. Varias destas melhorias envolvem banco de dados. O problema acontece quando a melhoria vai para o ambiente de produção.

Para garantir que todas as mudanças ocorram de forma correta, criamos esta SP e posteriormente a executamos. Sendo assim, o ambiente de db só é alterado se todas as mudanças ocorridas formem bem sucedidas. Evitando assim de ser criadas linhas ou tabelas que terão de ser removidas uma a uma em caso de erro em um query ao final do processo.

Este é o modelo que usei no meu caso e atendeu perfeitamente.

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_myProcedure`$$

CREATE PROCEDURE `sp_myProcedure`()
BEGIN
	DECLARE `_rollback` BOOL DEFAULT 0;
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
	START TRANSACTION;

		INSERT INTO SAMPLE 'DO YOUR SQL HERE';
		INSERT INTO SAMPLE 'DO YOUR SQL HERE';
		INSERT INTO SAMPLE 'DO YOUR SQL HERE';
		SELECT * FROM SAMPLE 'DO YOUR SQL HERE';

	IF _rollback = 1 THEN
		SELECT 'ROLLBACK__';
		ROLLBACK;
	ELSE
		SELECT 'COMMIT__';
		COMMIT;
	END IF;
END$$

DELIMITER ;

Após a execução deste metodo, tudo que temos que realizar é a chamada para a SP e pronto, se imprimir ‘COMMIT__’ na saída, significa que deu tudo certo. Caso a saída imprima ‘ROLLBACK__’, existe uma query com problema.

Ainda não achei uma maneira de imprimir o erro do Mysql na saída, mas só o fato de saber que algo deu errado e que isso não alterou o seu ambiente já ajuda muito.

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *