MySQL
przekazuje kod błędu do wywołującego i w oparciu o ten kod błędu, wywołujący może swobodnie zdecydować, czy chce zatwierdzić pracę wykonaną do tej pory (ignorując błąd z tym konkretnym INSERT
oświadczenie) lub wycofać transakcję.
To różni się od PostgreSQL
który zawsze przerywa transakcję w przypadku błędu i takie zachowanie jest źródłem wielu problemów.
Aktualizacja:
Złą praktyką jest używanie bezwarunkowego ROLLBACK
wewnątrz procedur składowanych.
Procedury składowane można układać w stosy, a transakcje nie, więc funkcja ROLLBACK
w zagnieżdżonej procedurze składowanej cofnie się do samego początku transakcji, a nie do stanu wykonania procedury składowanej.
Jeśli chcesz użyć transakcji do przywrócenia stanu bazy danych w przypadku błędów, użyj SAVEPOINT
konstrukcje i DECLARE HANDLER
aby cofnąć się do punktów zapisu:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Niepowodzenie jednej z wstawek spowoduje wycofanie wszystkich zmian wprowadzonych przez procedurę i wyjście z niej.