mysql回滚错误HANDLER无法正常工作

时间:2012-09-26 04:05:35

标签: mysql

我只是构建一个存储过程来测试mysql中的事务。

但不知怎的,它不起作用。

这是我的代码:

USE `test`;
DROP procedure IF EXISTS `testTran`;
DELIMITER $$
USE `test`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `testTran`()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION rollback;
    START TRANSACTION;
    INSERT INTO `test`.`books`(`name`,`number`) VALUES ('asd', 20);
    ALTER TABLE `test`.`books` ADD COLUMN `name` VARCHAR(45) NULL  AFTER `number` ;
    COMMIT;
END$$
DELIMITER ;

在内部事务中,第二个命令是创建一个将失败的存在列。我期望第一个插入将是回滚。但实际上,事实并非如此。插件可以正常工作。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

为了使用事务,您需要将表转换为InnoDB之类的事务表。

或者,您可以使用SAVEPOINT回滚存储过程所做的更改。

DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO identifier;

SAVEPOINT identifier;

START TRANSACTION;

INSERT INTO `test`.`books`(`name`,`number`) VALUES ('asd', 20);
ALTER TABLE `test`.`books` ADD COLUMN `name` VARCHAR(45) NULL  AFTER `number` ;

COMMIT;

答案 1 :(得分:0)

ALTER TABLE语句在执行之前会生成implicit COMMIT