MySQL
sender fejlkode til den, der ringer, og baseret på denne fejlkode kan den, der ringer, frit beslutte, om den ønsker at udføre arbejde, der er udført indtil nu (ignorerer fejlen med denne særlige INSERT
erklæring) eller for at tilbageføre transaktionen.
Dette er i modsætning til PostgreSQL
som altid afbryder transaktionen ved fejl, og denne adfærd er en kilde til mange problemer.
Opdatering:
Det er en dårlig praksis at bruge en ubetinget ROLLBACK
inde i de lagrede procedurer.
Lagrede procedurer kan stables, og transaktioner kan ikke, så en ROLLBACK
i en indlejret lagret procedure vil rulle tilbage til begyndelsen af transaktionen, ikke til tilstanden for udførelse af den lagrede procedure.
Hvis du vil bruge transaktioner til at gendanne databasetilstanden ved fejl, skal du bruge SAVEPOINT
konstruktioner og DECLARE HANDLER
for at rulle tilbage til lagringspunkterne:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Fejl i en af indsætningerne vil rulle alle ændringer foretaget af proceduren tilbage og afslutte den.