MySQL
übergibt einen Fehlercode an den Aufrufer, und basierend auf diesem Fehlercode kann der Aufrufer frei entscheiden, ob er die bis zu diesem Zeitpunkt geleistete Arbeit festschreiben möchte (wobei der Fehler mit diesem bestimmten INSERT
ignoriert wird Anweisung) oder um die Transaktion rückgängig zu machen.
Dies unterscheidet sich von PostgreSQL
die die Transaktion im Fehlerfall immer abbricht und dieses Verhalten eine Quelle vieler Probleme ist.
Aktualisierung:
Es ist eine schlechte Praxis, ein bedingungsloses ROLLBACK
zu verwenden innerhalb der gespeicherten Prozeduren.
Gespeicherte Prozeduren sind stapelbar und Transaktionen nicht, also ein ROLLBACK
innerhalb einer verschachtelten gespeicherten Prozedur wird zum Anfang der Transaktion zurückgesetzt, nicht zum Status der Ausführung der gespeicherten Prozedur.
Wenn Sie Transaktionen verwenden möchten, um den Datenbankstatus bei Fehlern wiederherzustellen, verwenden Sie SAVEPOINT
Konstrukte und DECLARE HANDLER
um zu den Sicherungspunkten zurückzukehren:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Ein Fehler bei einer der Einfügungen wird alle von der Prozedur vorgenommenen Änderungen rückgängig machen und sie beenden.