كيفية إصلاح ALL_OR_NONE_OPERATION_ROLLED_BACK في عمليات نشر Salesforce
سجل واحد سيئ في دفعة أُرسلت بخيار allOrNone=true تسبب في التراجع عن كل سجل في تلك الدفعة، بما فيها السجلات الصحيحة.
يظهر أثناء: عمليات DML الجماعية، وتحميل البيانات، وإعداد اختبارات Apexالمعنى
يعني ALL_OR_NONE_OPERATION_ROLLED_BACK أن عملية DML أُرسلت وقيمة allOrNone فيها true، وأن سجلاً واحدًا على الأقل في الدفعة فشل في التحقق، فقام Salesforce بالتراجع عن الدفعة بأكملها بدلاً من تثبيت السجلات الصحيحة فرديًا. هذا هو السلوك المتوقع لخيار allOrNone، وليس خللاً، لكنه قد يكون مكلفًا في الدفعات الكبيرة.
يظهر أينما تعمل عمليات DML الجماعية: استدعاء Database.insert(records, true) في Apex، أو مهمة Bulk API بخيار allOrNone مفعّلاً، أو جلسة Data Loader مع تعطيل "Insert null values" والنجاح الجزئي معًا. صف واحد سيئ في أي مكان بالدفعة يُسقط المعاملة بأكملها معه.
الأسباب الشائعة
الحل
- تحقق من السجلات من جهة العميل قبل الإرسالافحص شروط الفشل الواضحة، الحقول المطلوبة، قيم قوائم الاختيار، مقابل قواعد الكائن قبل إرسال الدفعة.
- اضبط allOrNone=false أثناء جولات الترحيلشغّل عمليات الترحيل بخيار allOrNone=false حتى لا تمنع الإخفاقات الفردية باقي الدفعة، ثم راجع السجلات الفاشلة وأصلحها.
- قسّم الدفعات الكبيرة إلى مجموعات أصغرقسّم عملية بيانات كبيرة إلى دفعات أصغر بحيث لا يؤثر السجل السيئ الواحد إلا على جزء صغير من الحمولة الإجمالية.
List<SObject> chunk = new List<SObject>(); for (Integer i = 0; i < records.size(); i++) { chunk.add(records[i]); if (chunk.size() == 200 || i == records.size() - 1) { Database.insert(chunk, false); chunk.clear(); } }
إزاي Serpent بتمنع ده
عمليات البيانات في Serpent مقسّمة إلى دفعات صغيرة ومُتحقق منها كجزء من خط الأنابيب، لذا يظهر السجل السيئ الواحد في عملية ترحيل مبكرًا مقابل دفعة صغيرة بدلاً من التراجع عن دفعة كبيرة في عمق عملية النشر. راجع مكتبة أخطاء نشر Salesforce.

الوقاية
أخطاء ذات صلة
ALL_OR_NONE_OPERATION_ROLLED_BACK، تمت الإجابة
ابدأ مجانًا. بدون بطاقة ائتمان، وبدون تثبيت، وبدون التزام.
يتم الإعداد في أقل من 15 دقيقة. لا حاجة لتوظيف متخصص DevOps.
