"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué mis procedimientos almacenados de MySQL no logran ejecutar transacciones exitosamente?

¿Por qué mis procedimientos almacenados de MySQL no logran ejecutar transacciones exitosamente?

Publicado el 2024-11-18
Navegar:643

Why Do My MySQL Stored Procedures Fail to Execute Transactions Successfully?

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:

  1. Faltan comas en Controlador de salida:

    • En la declaración EXIT HANDLER, debe haber comas que separen las condiciones.
  2. Falta punto y coma:

    • A la declaración END del EXIT HANDLER le falta un punto y coma final.

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;
Último tutorial Más>

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