transaction transaccion tran start sintaxis mysqltransaction example begin mysql transactions rollback

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 .