Я не могу найти оптимальный способ использовать транзакции в хранимой процедуре 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;