如何在Mysql中回滚?

时间:2011-11-11 15:39:31

标签: mysql transactions rollback

我想执行多个命令来更新客户数据库,但我想在事务中执行此命令,当一个命令发生错误时,所有更改都将被回滚。

当我在这个例子中运行代码时,如果test2表已经存在,则回滚没有工作,插入的行存在于测试表中。

我做错了什么?

MySQL服务器是5.1。 桌子的引擎是Innodb。

代码示例:

set autocommit = 0;
drop procedure if EXISTS rollbacktest;
delimiter //

CREATE PROCEDURE rollbacktest ()
   BEGIN

   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING  SET @x2 = 4; 
   SET autocommit = 0;
   start transaction;   

    SET @x2 = 0;

insert into test(t)values (800);

CREATE TABLE `test2` (
`t`  int(11) UNSIGNED NOT NULL 
    )
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_persian_ci ;


if @x2 = 4 THEN    ROLLBACK; else  commit;    end if;

   END;
//

CALL rollbacktest()

2 个答案:

答案 0 :(得分:1)

你的问题是你正在做DDL(CREATE TABLE),这在事务中无法完成,所以它会隐式提交你以前做过的事情。

如果你想做DROP TABLEALTER TABLETRUNCATE TABLE等事情,也会出现这种情况。基本上任何无法回滚的语句都会导致现有事务自动 - COMMIT ed

答案 1 :(得分:0)

如果我没记错的话,CREATE TABLE会隐式提交交易。

http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html