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