كيفية إصلاح UNABLE_TO_LOCK_ROW في عمليات نشر Salesforce

سجل تحتاج عملية النشر إلى تحديثه مقفل بواسطة معاملة أخرى تعمل في نفس الوقت.

يظهر أثناء: DML وقت التشغيل، وهو تعارض توقيت وليس مشكلة ميتاداتا أو بيانات

المعنى

يعني UNABLE_TO_LOCK_ROW أن Salesforce لم تتمكن من الحصول على قفل على سجل لأن معاملة أخرى، مثل مهمة دفعية أو تدفق مجدول أو اختبار Apex متزامن، كانت تحدّثه بالفعل. هذه مشكلة توقيت، وليست مشكلة ميتاداتا: عملية النشر أو اختباراتها صحيحة، لكنها تصادمت مع شيء آخر يعمل في المؤسسة.

يشيع هذا بشكل خاص مع علاقات master-detail، لأن تحديث أي سجل فرعي يحصل على قفل على السجل الأصل لإعادة حساب roll-up summary، لذا فإن عمليتي إدخال فرعيتين تتسابقان لتحديث نفس السجل الأصل في وقت واحد ستتنافسان على ذلك القفل.

التشخيص

الأسباب الشائعة

النشر أثناء استخدام نشط للمؤسسة
مستخدم آخر أو عملية مجدولة تحدّث نفس السجلات الأصل بينما تعمل اختبارات Apex الخاصة بعملية النشر.
اختبارات تحدّث سجل singleton مشترك
تحدّث عدة فئات اختبار نفس سجل الإعدادات أو التكوين على مستوى المؤسسة بالتوازي.
عمليات roll-up لعلاقة master-detail تتنافس على السجل الأصل
تُطلق عدة عمليات إدخال فرعية عمليات إعادة حساب roll-up summary على نفس السجل الرئيسي في آن واحد.

الحل

  1. أعد محاولة النشر
    أقفال السطور مؤقتة. غالبًا ما تنجح إعادة تشغيل نفس عملية النشر بمجرد انتهاء المعاملة المنافسة.
  2. انشر خلال فترة نشاط منخفض
    جدول عمليات نشر الإنتاج خارج ساعات العمل أو أوقف مؤقتًا المهام المجدولة المتعارضة أولًا.
  3. تجنّب التنافس على سجل مشترك في الاختبارات
    أعد هيكلة اختبارات Apex بحيث لا تحدّث جميعها نفس سجل الإعدادات singleton ضمن نفس المعاملة.
    for (Account parent : [SELECT Id FROM Account WHERE Id IN :parentIds FOR UPDATE]) {
        // lock parents explicitly and predictably before child DML
    }
من واقع الاستخدام

إزاي Serpent بتمنع ده

يجدول Serpent AI عمليات النشر لتجنب المهام المتعارضة المعروفة، فيظهر السطر المقفل كإعادة محاولة بنقرة واحدة على نفس المهمة بدلًا من فشل الإصدار. اطّلع على مكتبة أخطاء نشر Salesforce.

لوحة الإصدارات مع تنبيهات التعارض في Serpent

الوقاية

امنح المهام المجمعة والتدفقات المجدولة نوافذ غير متداخلة
وزّع المهام الدفعية المجدولة وتحميلات البيانات وعمليات النشر بحيث لا تتنافس على نفس السجلات الأصل في نفس الوقت.
صمّم سجلات إعدادات singleton مشتركة لتقليل التنافس
تجنّب أن تكتب العديد من فئات الاختبار أو المشغلات المستقلة إلى سجل إعدادات واحد على مستوى المؤسسة؛ قسّم التكوين حسب المجال حيثما أمكن.
أضف إعادة محاولة تلقائية في أدوات النشر لهذا الخطأ تحديدًا
اضبط CI لاكتشاف UNABLE_TO_LOCK_ROW تحديدًا وإعادة المحاولة تلقائيًا مرة أو مرتين، لأنه أحد الأخطاء القليلة في Salesforce التي تكون فيها إعادة المحاولة البسيطة هي الحل الصحيح.
أسئلة شائعة

UNABLE_TO_LOCK_ROW: الإجابة

هل يحدث UNABLE_TO_LOCK_ROW أبدًا بسبب ميتاداتا سيئة؟
نادرًا. يكاد يكون دائمًا تعارض توقيت مع عملية أخرى، ولهذا فإن مجرد إعادة محاولة النشر تحل معظم الحالات.
هل يمنع استخدام FOR UPDATE في SOQL هذا الخطأ أم يسببه؟
تحصل FOR UPDATE على قفل عمدًا، لذا يمكن أن تسبب UNABLE_TO_LOCK_ROW إذا كانت معاملة أخرى تحتفظ بالقفل بالفعل؛ عند استخدامها بشكل صحيح، تجعل القفل صريحًا ومتوقعًا بدلًا من عرضي.
كم مرة ينبغي أن تعيد خط الأنابيب المحاولة قبل التعامل مع هذا كفشل حقيقي؟
تلتقط محاولتان أو ثلاث محاولات مع تأخير قصير بينها الغالبية العظمى من تعارضات القفل المؤقتة؛ وإذا استمر الفشل بعد ذلك، فتعامل معه كمشكلة تصميم حقيقية تستحق التحقيق.

ابدأ مجانًا. بدون بطاقة ائتمان، وبدون تثبيت، وبدون التزام.

يتم الإعداد في أقل من 15 دقيقة. بدون الحاجة لتوظيف DevOps.

هل تريد معرفة كيف يمكنكم الشحن أسرع قبل البدء؟ لنتحدث

بدون التزام.