Confirmar transacción o utilizar rollback en MySQL

publicado por: Anonymous

Un pregunta, resulta que estoy haciendo un procedimiento almacenado en MySQL, el cual tiene como objetivo, insertar valores en tres distintas tablas, es de suma importancia que los tres valores se inserten al mismo tiempo, he leido que en tablas innodb, se puede mediante rollback cancelar todas las insercciones si alguna falla por cuestiones de caida del servidor, etc, el problema es que no encuentro la forma correcta de implementarlo en mi procedimiento. Espero me puedan apoyar. Muchas gracias. A continuación mi código de muestra.

CREATE PROCEDURE `insertar` (parametro varchar(10))
BEGIN
INSERT INTO `bd`.`tabla1` (`campo`) VALUES (parametro);
INSERT INTO `bd`.`tabla2` (`campo`) VALUES (parametro);
INSERT INTO `bd`.`tabla3` (`campo`) VALUES (parametro);
/*Aquí no encuentro la forma de comprobar que se hayan realizado todos querys, en su caso hacer commit o rollback*/
END

solución

Transacción en MySQL Procedimiento almacenado

Para realizar el ROLLBACK en MySQL Stored Procedure, debemos declarar el manejador de salida en el procedimiento almacenado. Hay dos tipos de controladores que podemos tener en MySQL Stored Procedure.

sqlexception
sqlwarning

sqlexception se ejecutará cuando se produzca algún error durante la ejecución de la consulta y sqlwarning se ejecutará cuando se produzca una advertencia en MySQL Stored Procedure. Veamos cómo podemos tener esos bloqueos en el Procedimiento almacenado.

Con tu codigo quedaria algo como:

DELIMITER $$

CREATE PROCEDURE `insertar` (parametro varchar(10))

BEGIN

DECLARE manejador de salida para sqlexception
  BEGIN
    -- ERROR
  ROLLBACK;
END;

DECLARE manejador de salida para sqlwarning
 BEGIN
    -- WARNING
 ROLLBACK;
END;

START TRANSACTION;

INSERT INTO `bd`.`tabla1` (`campo`) VALUES (parametro);
INSERT INTO `bd`.`tabla2` (`campo`) VALUES (parametro);
INSERT INTO `bd`.`tabla3` (`campo`) VALUES (parametro);

COMMIT;
END
$$
Respondido por: Anonymous

Leave a Reply

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