Ich kann einen optimalen Weg zur Verwendung von Transaktionen in einer MySql Stored Procedure finden. Ich möchte ROLLBACK
, wenn etwas fehlschlägt:MySql Stored Procedures, Transaktionen und Rollbacks
BEGIN
SET autocommit=0;
START TRANSACTION;
DELETE FROM customers;
INSERT INTO customers VALUES(100);
INSERT INTO customers VALUES('wrong type');
COMMIT;
END
1) Ist autocommit=0
erforderlich?
2) Wenn der zweite INSERT
bricht (und es natürlich tut) wird der erste INSERT
nicht zurückgerollt. Das Verfahren läuft einfach weiter bis zum COMMIT
. Wie kann ich das verhindern?
3) Ich habe festgestellt, dass ich kann DECLARE HANDLER
, sollte ich diese Anweisung verwenden oder gibt es eine einfachere Möglichkeit zu sagen, dass wenn ein Befehl fehlschlägt, sollte die gespeicherte Prozedur ROLLBACK
und scheitern auch?
DECLARE HANDLER
funktioniert gut, aber da ich MySql Version 5.1 habe, kann ich RESIGNAL
nicht verwenden. Also, wenn ein Fehler auftritt, wird der Anrufer nicht informiert:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- RESIGNAL; not in my version :(
END;
START TRANSACTION;