Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Transaktionsrätsel

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.