mysql事务 – 回滚任何exception
如果在mysql命令列表中发生任何错误,是否可以自动回滚?
比如说:
begin transaction; insert into myTable values1 ... insert into myTable values2 ...; -- will throw an error commit;
现在,执行我希望整个事务失败,因此我不应该看到myTable中的values1。 但不幸的是,即使交易存在错误,表格也正在被价值化。
任何想法如何使它回滚? (再次,在任何错误)?
编辑 – 从DDL更改为标准的SQL
你可以使用13.6.7.2。 DECLARE … HANDLER语法如下:
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 ;
有关完整的示例,请检查以下SQL小提琴 。
你可以使用EXIT HANDLER,例如,如果你需要在你的代码中注册一个特定的SQL EXCEPTION。 例如:
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 ;