"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que meus procedimentos armazenados do MySQL não conseguem executar transações com sucesso?

Por que meus procedimentos armazenados do MySQL não conseguem executar transações com sucesso?

Publicado em 2024-11-18
Navegar:566

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

Resolvendo problemas transacionais em procedimentos armazenados do MySQL

Ao tentar implementar transações dentro de um procedimento armazenado do MySQL, os desenvolvedores podem encontrar erros inesperados. Este artigo explorará a sintaxe e os erros lógicos que podem impedir a execução bem-sucedida de procedimentos armazenados transacionais.

O caso: uma transação malsucedida

Um desenvolvedor encontra um problema quando tentativa de implementar transações em um procedimento armazenado. Apesar de seguir a documentação do MySQL, o procedimento não é executado com sucesso e solicita a incapacidade de salvar as alterações. Após uma inspeção mais aprofundada, o código parece estar sintaticamente correto.

Analisando o código

O snippet de código fornecido é o seguinte:

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

Identificando os erros

Após um exame minucioso, dois erros de sintaxe são identificados:

  1. Vírgulas ausentes em Exit Handler:

    • Na declaração EXIT HANDLER, deve haver vírgulas separando o condições.
  2. Ponto e vírgula ausente:

    • A instrução END do EXIT HANDLER está faltando um ponto e vírgula final.

O código corrigido

O código corrigido é o seguinte:

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;
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3