Nie mogę znaleźć optymalnego sposobu na wykorzystanie transakcji w procedurze przechowywanej MySql. Chcę ROLLBACK
jeśli coś się nie powiedzie:Procedury składowane MySql, transakcje i wycofywanie zmian
BEGIN
SET autocommit=0;
START TRANSACTION;
DELETE FROM customers;
INSERT INTO customers VALUES(100);
INSERT INTO customers VALUES('wrong type');
COMMIT;
END
1) Czy autocommit=0
wymagane?
2) Jeśli drugi INSERT
zrywa (i to oczywiście) pierwszy INSERT
nie jest wycofywany. Procedura po prostu trwa do COMMIT
. Jak mogę temu zapobiec?
3) Znalazłem, że mogę DECLARE HANDLER
, powinienem użyć tej instrukcji lub czy istnieje prostszy sposób, aby powiedzieć, że jeśli jakaś komenda nie powiedzie się, procedura składowana powinna ROLLBACK
i również się nie powiedzie?
DECLARE HANDLER
działa dobrze, ale ponieważ mam wersję MySql 5.1, nie mogę używać RESIGNAL
. Więc jeśli wystąpi błąd, dzwoniący nie zostanie powiadomiony:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- RESIGNAL; not in my version :(
END;
START TRANSACTION;