2010-09-29 15 views
11

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; 

Antwort

9

Antwort 1: Sie brauchen nicht gesetzt autocommit = 0

Mit START TRANSACTION, autocommit bis Sie deaktiviert bleibt Beenden Sie die Transaktion mit COMMIT oder ROLLBACK. Der Autocommit-Modus kehrt dann zu in seinen vorherigen Zustand zurück.

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

0

Anders zur Antwort 2: Sie eine boolean Variable verwenden könnte zu wissen, ob Sie COMMIT oder ROLLBACK sollte. Zum Beispiel:

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 

Oder könnten Sie Ihre sehr nützlich 3) verwenden

Verwandte Themen