«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему мои хранимые процедуры MySQL не могут успешно выполнить транзакции?

Почему мои хранимые процедуры MySQL не могут успешно выполнить транзакции?

Опубликовано 18 ноября 2024 г.
Просматривать:671

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

Решение транзакционных проблем в хранимых процедурах 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

Выявление ошибок

При внимательном рассмотрении выявлены две синтаксические ошибки:

  1. Отсутствуют запятые в Обработчик выхода:

    • В объявлении EXIT HANDLER условия должны быть разделены запятыми.
  2. Отсутствует точка с запятой:

    • В операторе END EXIT HANDLER отсутствует завершающая точка с запятой.

Исправленный код

Исправленный код выглядит следующим образом:

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