我只是构建一个存储过程来测试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 ;
在内部事务中,第二个命令是创建一个将失败的存在列。我期望第一个插入将是回滚。但实际上,事实并非如此。插件可以正常工作。
有人可以帮忙吗?
答案 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。