"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تفشل إجراءات MySQL المخزنة في تنفيذ المعاملات بنجاح؟

لماذا تفشل إجراءات MySQL المخزنة في تنفيذ المعاملات بنجاح؟

تم النشر بتاريخ 2024-11-18
تصفح:700

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

حل مشكلات المعاملات في الإجراءات المخزنة في MySQL

عند محاولة تنفيذ المعاملات ضمن إجراء MySQL المخزن، قد يواجه المطورون أخطاء غير متوقعة. سوف تستكشف هذه المقالة بناء الجملة والأخطاء المنطقية التي يمكن أن تمنع التنفيذ الناجح للإجراءات المخزنة للمعاملات.

الحالة: معاملة غير ناجحة

يواجه المطور مشكلة عندما محاولة تنفيذ المعاملات في إجراء مخزن. على الرغم من اتباع وثائق MySQL، فشل تنفيذ الإجراء بنجاح ويؤدي إلى عدم القدرة على حفظ التغييرات. بعد مزيد من الفحص، يبدو أن الكود صحيح من الناحية النحوية.

تحليل الكود

مقتطف الكود المقدم هو كما يلي:

البدء أعلن عن poid INT ؛ قم بتعريف معالج الخروج لـ SQLEXCEPTION SQLWARNING يبدأ العودة؛ نهاية بدء المعاملة؛ - إضافة الخيار 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,' '); - إضافة الخيار 12 INSERT INTO Product_option(product_id,option_id,required) VALUES(insertedProductID,12,1); - إضافة الخيار 13 INSERT INTO Product_option(product_id,option_id,required) VALUES(insertedProductID,13,0); يقترف؛ نهاية
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 الخاصة بمعالج الخروج تفتقد فاصلة منقوطة.

الكود المصحح

الرمز المصحح هو كما يلي:

ابدأ أعلن عن poid INT ؛ قم بتعريف معالج الخروج لـ SQLEXCEPTION وSQLWARNING يبدأ العودة؛ نهاية؛ بدء المعاملة؛ - إضافة الخيار 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,' '); - إضافة الخيار 12 INSERT INTO Product_option(product_id,option_id,required) VALUES(insertedProductID,12,1); - إضافة الخيار 13 INSERT INTO Product_option(product_id,option_id,required) VALUES(insertedProductID,13,0); يقترف؛ نهاية؛
            
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3