transaccion - save transaction mysql
transacción mysql: revierte cualquier excepción (2)
¿Es posible retroceder automáticamente si se produce algún error en una lista de comandos mysql?
por ejemplo, algo parecido a:
begin transaction;
insert into myTable values1 ...
insert into myTable values2 ...; -- will throw an error
commit;
ahora, al ejecutar quiero que toda la transacción falle y, por lo tanto, NO debería ver values1 en myTable. pero, desafortunadamente, la tabla se está registrando con valores1 aunque la transacción tenga errores.
¿Alguna idea de cómo hago para revertir? (de nuevo, en cualquier error)?
EDITAR - cambiado de DDL a SQL estándar
Podría usar EXIT HANDLER si, por ejemplo, necesita SEÑALAR una EXCEPCIÓN SQL específica en su código. Por ejemplo:
DELIMITER $$
CREATE PROCEDURE `sp_fail`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK; -- rollback any changes made in the transaction
RESIGNAL; -- raise again the sql exception to the caller
END;
START TRANSACTION;
insert into myTable values1 ...
IF fail_condition_meet THEN
SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = ''Custom error detected.'', MYSQL_ERRNO = 2000;
END IF;
insert into myTable values2 ... -- this will not be executed
COMMIT; -- this will not be executed
END$$
DELIMITER ;
Puedes usar 13.6.7.2. DECLARAR ... Sintaxis HANDLER de la siguiente manera:
DELIMITER $$
CREATE PROCEDURE `sp_fail`()
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
INSERT INTO `tablea` (`date`) VALUES (NOW());
INSERT INTO `tableb` (`date`) VALUES (NOW());
INSERT INTO `tablec` (`date`) VALUES (NOW()); -- FAIL
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END$$
DELIMITER ;
Para ver un ejemplo completo, consulte el siguiente SQL Fiddle .