Dies ist nur eine Erklärung, die in anderen Antworten nicht angesprochen wird
Zumindest in neueren Versionen von MySQL wird Ihre erste Abfrage nicht festgeschrieben .
Wenn Sie es in derselben Sitzung abfragen, werden die Änderungen angezeigt. Wenn Sie es jedoch in einer anderen Sitzung abfragen, sind die Änderungen nicht vorhanden und werden nicht festgeschrieben .
Was ist los?
Wenn Sie eine Transaktion öffnen und eine darin enthaltene Abfrage fehlschlägt, bleibt die Transaktion geöffnet und die Änderungen werden weder festgeschrieben noch rückgängig gemacht .
So ACHTUNG , jede Tabelle / Zeile , die mit einer früheren Abfrage wie gesperrt wurde SELECT ... FOR SHARE/UPDATE
, UPDATE
, INSERT
oder jede andere Sperrabfrage gesperrt hält , bis diese Sitzung getötet wird (und führt einen Rollback), oder bis eine nachfolgende Abfrage verpflichtet explizit ( COMMIT
) oder implizit , wodurch die Teiländerungen dauerhaft werden (was Stunden später passieren kann, während sich die Transaktion in einem Wartezustand befindet).
Aus diesem Grund besteht die Lösung darin, Handler sofort zu deklarieren, ROLLBACK
wenn ein Fehler auftritt.
Extra
Im Handler können Sie den Fehler auch mit erneut auslösen RESIGNAL
, andernfalls wird die gespeicherte Prozedur "Erfolgreich" ausgeführt.
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
START TRANSACTION;
COMMIT;
END