MySQL
předá volajícímu chybový kód a na základě tohoto chybového kódu se volající může svobodně rozhodnout, zda chce provést dosud vykonanou práci (chybu s tímto konkrétním INSERT
ignoruje výpis) nebo k vrácení transakce.
To je na rozdíl od PostgreSQL
který vždy při chybě přeruší transakci a toto chování je zdrojem mnoha problémů.
Aktualizace:
Je špatné používat bezpodmínečné ROLLBACK
uvnitř uložených procedur.
Uložené procedury jsou stohovatelné a transakce nikoli, takže ROLLBACK
uvnitř vnořené uložené procedury se vrátí zpět na úplný začátek transakce, nikoli do stavu provedení uložené procedury.
Pokud chcete použít transakce k obnovení stavu databáze při chybách, použijte SAVEPOINT
konstrukty a DECLARE HANDLER
pro návrat k uloženým bodům:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Selhání kteréhokoli vložení vrátí zpět všechny změny provedené procedurou a ukončí ji.