Решение транзакционных проблем в хранимых процедурах MySQL
При попытке реализовать транзакции в хранимой процедуре MySQL разработчики могут столкнуться с непредвиденными ошибками. В этой статье будут рассмотрены синтаксические и логические ошибки, которые могут помешать успешному выполнению транзакционных хранимых процедур.
Случай: неудачная транзакция
Разработчик сталкивается с проблемой, когда попытка реализовать транзакции в хранимой процедуре. Несмотря на соблюдение документации MySQL, процедура не выполняется успешно и приводит к невозможности сохранения изменений. При дальнейшей проверке код оказался синтаксически правильным.
Анализ кода
Приведенный фрагмент кода выглядит следующим образом:
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
Выявление ошибок
При внимательном рассмотрении выявлены две синтаксические ошибки:
Отсутствуют запятые в Обработчик выхода:
Отсутствует точка с запятой:
Исправленный код
Исправленный код выглядит следующим образом:
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;
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3