Resolver problemas transaccionales en procedimientos almacenados de MySQL
Al intentar implementar transacciones dentro de un procedimiento almacenado de MySQL, los desarrolladores pueden encontrar errores inesperados. Este artículo explorará la sintaxis y los errores lógicos que pueden impedir la ejecución exitosa de procedimientos almacenados transaccionales.
El caso: una transacción fallida
Un desarrollador encuentra un problema cuando intentar implementar transacciones en un procedimiento almacenado. A pesar de seguir la documentación de MySQL, el procedimiento no se ejecuta correctamente y no permite guardar los cambios. Tras una inspección más detallada, el código parece ser sintácticamente correcto.
Analizando el código
El fragmento de código proporcionado es el siguiente:
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
Identificación de los errores
Tras un examen minucioso, se identifican dos errores de sintaxis:
Faltan comas en Controlador de salida:
Falta punto y coma:
El código corregido
El código corregido es el siguiente:
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;
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3