Mysql
 sql >> Database >  >> RDS >> Mysql

Enigma della transazione MySQL

MySQL passa il codice di errore al chiamante e in base a questo codice di errore il chiamante è libero di decidere se vuole eseguire il commit del lavoro svolto fino al momento (ignorando l'errore con questo particolare INSERT estratto conto) o per annullare la transazione.

Questo è diverso da PostgreSQL che interrompe sempre la transazione in caso di errore e questo comportamento è fonte di molti problemi.

Aggiornamento:

È una cattiva pratica usare un ROLLBACK incondizionato all'interno delle stored procedure.

Le stored procedure sono impilabili e le transazioni no, quindi un ROLLBACK all'interno di una stored procedure nidificata verrà eseguito il rollback all'inizio della transazione, non allo stato di esecuzione della stored procedure.

Se desideri utilizzare le transazioni per ripristinare lo stato del database in caso di errori, utilizza SAVEPOINT costrutti e DECLARE HANDLER per tornare ai punti di salvataggio:

CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

L'errore in uno dei due inserti annullerà tutte le modifiche apportate dalla procedura e ne uscirà.