2010-09-29 25 views
11

Non riesco a trovare un modo ottimale per utilizzare le transazioni in una stored procedure MySql. Voglio ROLLBACK se qualcosa non riesce:MySql stored procedure, transazioni e rollback

BEGIN 

    SET autocommit=0; 
    START TRANSACTION; 

    DELETE FROM customers; 
    INSERT INTO customers VALUES(100); 
    INSERT INTO customers VALUES('wrong type'); 

    COMMIT; 
END 

1) Is autocommit=0 richiesto?

2) Se il secondo INSERT interrompe (e lo fa ovviamente) il primo INSERT non viene ripristinato. La procedura continua semplicemente fino al COMMIT. Come posso evitare questo?

3) Ho trovato che posso DECLARE HANDLER, dovrei usare questa istruzione o c'è un modo più semplice per dire che se qualche comando fallisce, la procedura memorizzata dovrebbe ROLLBACK e fallire anche tu?

DECLARE HANDLER funziona correttamente, ma poiché ho MySql versione 5.1 non è possibile utilizzare RESIGNAL. Quindi, se si verifica un errore, il chiamante non sarà notificato:

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
    ROLLBACK; 
    -- RESIGNAL; not in my version :(
END; 

START TRANSACTION; 

risposta

9

Risposta a 1: Non è necessario impostare autocommit = 0

Con START TRANSACTION, autocommit rimane disattivato finché non si terminare la transazione con COMMIT o ROLLBACK. La modalità autocommit ripristina lo stato allo stato precedente.

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

0

diverso approccio alla Risposta 2: Si potrebbe utilizzare una variabile booleana per sapere se si deve commit o rollback. Per esempio:

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 

Oppure, si potrebbe utilizzare il vostro molto utile 3)

Problemi correlati