1

我只是构建了一个存储过程来测试 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 ;

在事务内部,第二个命令是创建一个将失败的存在列。我期望的是第一个插入将是回滚。但实际上,并非如此。插入确实有效。

任何人都可以帮忙吗?

4

2 回答 2

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;
于 2012-09-26T04:48:49.640 回答
0

ALTER TABLE 语句在执行之前会导致隐式 COMMIT 。

于 2014-01-08T13:58:21.150 回答