Как откатиться в Mysql? - PullRequest
       24

Как откатиться в Mysql?

0 голосов
/ 11 ноября 2011

Я хочу выполнить несколько команд для обновления базы данных клиентов, но я хочу, чтобы эта команда выполнялась в транзакции, и при возникновении ошибки в одной команде все изменения будут откатываться назад.

Когда я запускаю код в этом примере, если таблица 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 ]

1 голос
/ 11 ноября 2011

Ваша проблема в том, что вы выполняете DDL (CREATE TABLE), чего нельзя сделать в транзакции, поэтому он неявно фиксирует то, что вы сделали ранее.

Это также будетслучай, если вы хотите сделать DROP TABLE, ALTER TABLE или TRUNCATE TABLE, среди прочего.По существу, любое утверждение, которое не может быть откатано, приведет к автоматическому COMMIT ed

существующим транзакциям.
0 голосов
/ 11 ноября 2011

Если я правильно помню, CREATE TABLE неявно фиксирует транзакцию.

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

...