Lösen von Transaktionsproblemen in gespeicherten MySQL-Prozeduren
Beim Versuch, Transaktionen innerhalb einer gespeicherten MySQL-Prozedur zu implementieren, können Entwickler auf unerwartete Fehler stoßen. In diesem Artikel werden die Syntax- und logischen Fehler untersucht, die die erfolgreiche Ausführung transaktionaler gespeicherter Prozeduren verhindern können.
Der Fall: Eine erfolglose Transaktion
Ein Entwickler stößt auf ein Problem, wenn Versuch, Transaktionen in einer gespeicherten Prozedur zu implementieren. Obwohl die MySQL-Dokumentation befolgt wird, schlägt die erfolgreiche Ausführung des Verfahrens fehl und führt dazu, dass die Änderungen nicht gespeichert werden können. Bei näherer Betrachtung scheint der Code syntaktisch korrekt zu sein.
Analyse des Codes
Der bereitgestellte Codeausschnitt lautet wie folgt:
BEGIN DECLARE poid INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION SQLWARNING BEGIN ROLLBACK; END START TRANSACTION; -- ADD option 5 INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0); SET poid = (SELECT LAST_INSERT_ID()); INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,' ',0,' ',0,' '); -- ADD option 12 INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1); -- ADD option 13 INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0); COMMIT; END
Identifizieren der Fehler
Bei genauer Betrachtung werden zwei Syntaxfehler identifiziert:
Fehlende Kommas in Exit-Handler:
Fehlendes Semikolon:
Der korrigierte Code
Der korrigierte Code lautet wie folgt:
BEGIN DECLARE poid INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING BEGIN ROLLBACK; END; START TRANSACTION; -- ADD option 5 INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0); SET poid = (SELECT LAST_INSERT_ID()); INSERT INTO product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,price_prefix,points,points_prefix,weight,weight_prefix) VALUES(poid,insertedProductID,5,50,0,0,4.99,' ',0,' ',0,' '); -- ADD option 12 INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1); -- ADD option 13 INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,13,0); COMMIT; END;
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3