MySQL
geeft wel foutcode door aan de beller en op basis van deze foutcode is de beller vrij om te beslissen of hij het tot nu toe verrichte werk wil vastleggen (de fout negerend met deze specifieke INSERT
afschrift) of om de transactie terug te draaien.
Dit is anders dan PostgreSQL
die de transactie altijd afbreekt bij een fout en dit gedrag is een bron van veel problemen.
Bijwerken:
Het is een slechte gewoonte om een onvoorwaardelijke ROLLBACK
. te gebruiken binnen de opgeslagen procedures.
Opgeslagen procedures zijn stapelbaar en transacties niet, dus een ROLLBACK
binnen een geneste opgeslagen procedure wordt teruggedraaid naar het allereerste begin van de transactie, niet naar de status van de uitvoering van de opgeslagen procedure.
Als u transacties wilt gebruiken om de databasestatus bij fouten te herstellen, gebruikt u SAVEPOINT
constructies en DECLARE HANDLER
om terug te gaan naar de opslagpunten:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Als een van beide invoegtoepassingen mislukt, worden alle wijzigingen die door de procedure zijn aangebracht ongedaan gemaakt en wordt deze afgesloten.