MySQL
предава код за грешка на обаждащия се и въз основа на този код за грешка обаждащият се е свободен да реши дали иска да поеме извършена работа до момента (игнорирайки грешката с този конкретен INSERT
изявление) или за връщане на транзакцията.
Това е за разлика от PostgreSQL
което винаги прекъсва транзакцията при грешка и това поведение е източник на много проблеми.
Актуализация:
Лоша практика е да използвате безусловен ROLLBACK
вътре в съхранените процедури.
Съхранените процедури могат да се подреждат, а транзакциите не, така че ROLLBACK
в рамките на вложена съхранена процедура ще се върне обратно до самото начало на транзакцията, а не до състоянието на изпълнение на съхранената процедура.
Ако искате да използвате транзакции за възстановяване на състоянието на базата данни при грешки, използвайте SAVEPOINT
конструкции и DECLARE HANDLER
за връщане към точките за запис:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Неуспехът в което и да е вмъкване ще отмени всички промени, направени от процедурата, и ще излезе от нея.