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à.