سؤال

لدي بسيطة نسبيا التطبيق جانغو, مع الاستخدام الكثيف هو المسؤول عن بعض التزامن في db العمليات.

لدي نموذج آخر مع m2m العلامة نموذج.

سطر واحد في قانون بلدي ، p.add(t) مرارا وتكرارا مما تسبب في الخلية الاستثناءات (حيث p هو آخر سبيل المثال ، t هو الوسم سبيل المثال.)

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")

عندما يتم رفع يمكنني يدويا تشغيل هذا p.add(t) بنجاح, لذلك يجب القيام به مع بعض غريبة الدولة التي db/التطبيق في وقت التنفيذ العادي.يحدث عن مرة واحدة كل 1000 الوسم-إضافة المحاولات ، دون أي النمط الذي يمكن الكشف عن (أنا.ه كل الأرقام في "329051-1827414" زوج من المثال تغيير)

A CHECK TABLE في الخلية في الجدول ذي الصلة يدل على أنهم جميعا على ما يبدو موافق.

أي أفكار ؟

هل كانت مفيدة؟

المحلول

عادة ما ترى أخطاء مثل التي عند محاولة إضافة إلى وسيطة الجدول إذا كان الصف إضافة التكرارات فريدة من نوعها-معا القيد عن FK هو.أظن أن في المثال الذي قدمته "329051" Post id "1827414" هو معرف العلامة.

عادة في جانغو يمكنك استدعاء إضافة() الأسلوب مرارا وتكرارا إضافة نفس المثال و جانغو تأخذ الرعاية من كل شيء بالنسبة لك.أنا على افتراض النموذج مدير تحتفظ بعض الدول للمساعدة في تحديد ما إذا كان كل إضافة() يمثل الجديدة أو القائمة الصف إذا كان الصف يبدو الجديدة محاولات إدراج.

هذا في حد ذاته لا يفسر لماذا كنت تحصل على خطأ.ذكرت "هو المسؤول عن بعض التزامن في db العمليات.".دون معرفة ماذا يعني ذلك ، أعتقد أنه يمكن الحصول على حالة سباق متعددة حيث الموضوع/العمليات هي محاولة لإضافة نفس العلامة الجديدة في نفس الوقت وكلاهما محاولة إدراج.

نصائح أخرى

أعتقد أنني أرى مشكلة مماثلة في تطبيقي - إذا أرسلت طلبين متطابقين لإضافة علاقة M2M (على سبيل المثال ، في حالتي أيضًا) ، أحصل على هذا الخطأ لأن جدول M2M له قيد فريدة من نوعه (المستخدم ، بطاقة شعار). أظن أن الخادم يعالج وظائف .add في نفس الوقت.

if not already in database:
   # Both invocations reach here because the next line takes some time to process.
   create m2m row

لا أعرف كيف يمكن علاج ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top