解决 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;
以上是为什么我的MySQL存储过程无法成功执行事务?的详细内容。更多信息请关注PHP中文网其他相关文章!