MySql хранимые процедуры, транзакции и откаты - PullRequest
11 голосов
/ 29 сентября 2010

Я не могу найти оптимальный способ использовать транзакции в хранимой процедуре MySql.Я хочу ROLLBACK, если что-то не получается:

BEGIN

    SET autocommit=0;
    START TRANSACTION;

    DELETE FROM customers;
    INSERT INTO customers VALUES(100);
    INSERT INTO customers VALUES('wrong type');

    COMMIT;
END

1) Требуется ли autocommit=0?

2) Если второй INSERT ломается (и, конечно, работает),Первый INSERT не откатывается.Процедура просто продолжается до COMMIT.Как я могу предотвратить это?

3) Я обнаружил, что могу DECLARE HANDLER, должен ли я использовать эту инструкцию или есть более простой способ сказать, что если какая-либо команда не выполняется, хранимая процедура должна ROLLBACKи сбой тоже?

DECLARE HANDLER работает нормально, но, поскольку у меня MySql версии 5.1, я не могу использовать RESIGNAL.Поэтому, если произойдет ошибка, звонящий не будет уведомлен:

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
    ROLLBACK; 
    -- RESIGNAL; not in my version :(
END;

START TRANSACTION;

Ответы [ 2 ]

10 голосов
/ 08 ноября 2011

Ответ на 1: вам не нужно устанавливать autocommit = 0

С START TRANSACTION, автоматическая фиксация остается отключенной, пока вы не завершите транзакция с помощью COMMIT или ROLLBACK. Затем режим автоматической фиксации возвращается в прежнее состояние.

http://dev.mysql.com/doc/refman/5.6/en/commit.html

1 голос
/ 25 августа 2016

Другой подход к ответу 2: Вы можете использовать логическую переменную, чтобы узнать, следует ли вам использовать COMMIT или ROLLBACK.Например:

BEGIN

DECLARE `should_rollback` BOOL DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `should_rollback` = TRUE;

START TRANSACTION;

DELETE FROM customers;
INSERT INTO customers VALUES(100);
INSERT INTO customers VALUES('wrong type');

IF `should_rollback` THEN
    ROLLBACK;
ELSE
    COMMIT;
END IF;
END

Или, вы можете использовать свой очень полезный 3)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...