我想执行多个命令来更新客户数据库,但我想在事务中执行此命令,当一个命令发生错误时,所有更改都将被回滚。
当我在这个例子中运行代码时,如果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()
答案 0 :(得分:1)
你的问题是你正在做DDL(CREATE TABLE
),这在事务中无法完成,所以它会隐式提交你以前做过的事情。
如果你想做DROP TABLE
,ALTER TABLE
或TRUNCATE TABLE
等事情,也会出现这种情况。基本上任何无法回滚的语句都会导致现有事务自动 - COMMIT
ed
答案 1 :(得分:0)
如果我没记错的话,CREATE TABLE
会隐式提交交易。