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:
Vírgulas ausentes em Exit Handler:
Ponto e vírgula ausente:
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;
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