كيف أقوم بإصلاح مشكلة MySQL/Innodb Deadlocking في بيئة غير محظورة؟

StackOverflow https://stackoverflow.com/questions/870097

  •  22-08-2019
  •  | 
  •  

سؤال

نحن نستخدم MySQL مع تخزين Innodb Engine.لدينا بيئة "حدث" ترسل طلبات متعددة متزامنة على الجدول.ببساطة إنه يعمل بهذا الشكل:لدينا وظيفة find_or_insert التي تقوم بذلك:-Find () -> على النتيجة ، إذا فارغة -> إدراج -> على النتيجة Find ()

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

للأسف نتلقى هذه الأخطاء:"تم العثور على طريق مسدود عند محاولة الحصول على القفل؛حاول إعادة تشغيل المعاملة"

يمكن لأي شخص أن يساعد في ذلك؟

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

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

المحلول

جرب ال دليل مرجعي MySQL للتشخيص والحل.يبدو أنك تقوم بإنشاء ذاكرة تخزين مؤقت.قد يكون السبب المحتمل هو أن الكثير من العملاء قاموا بالنقر بشكل متزامن على الجدول محاولين إنشاء "الإصدار الأول" (أي اضغط على "إذا كان الإدخال فارغًا").ربما يمكنك إضافة تأخير عشوائي زائف أو تنسيق المنشئين بحيث لا تحصل على الكثير من مكالمات الإنشاء المتزامنة إلى قاعدة البيانات؟

يحرر:هل رأيت هذا صفحة؟يبدو أنك بحاجة إلى ضبط إعداد my.cnf لتعطيل الأقفال لكل جدول باستخدام innodb.لكن ما كنت أقترحه بشكل أساسي هو أن اختبارك قد لا يكون قابلاً للتمثيل لأنه قد يحتوي على نسبة مئوية أعلى بكثير من الكتاب مقارنة بالموقف الواقعي.إذا بدأت 100 سلسلة رسائل بجدول فارغ، فسيتم حظرها جميعًا على الفور عند الإنشاء (ربما حتى بنفس القيمة).وهذا أسوأ بكثير مما هو عليه في الموقف المتوسط ​​حيث يكون لديك انتشار أفضل على المفاتيح، وعدد أقل من الأخطاء ونسبة أعلى بكثير من القراءات.إذا كان هذا سلوكًا متوقعًا (أي سيكون هذا السلوك مباشرًا)، فإنني أقترح إضافة إستراتيجية تراجع في عبارات الإنشاء.

نصائح أخرى

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

وأنت طعاما قال إن هذا غير معقول، أو أنك لسبب ما تحتاج هذه الأمور تتحرك بسرعة.

وأنا المتغيرة جوابي لتعكس أن تتم مراجعة هذه المسألة. هذا يبدو الآن مثل هذه ليست سوى مشكلة مع إدراج المتزامنة، وليس الاعتماد على سلوك البحث.

وإنها فهمت أن ك InnoDB لا صف تأمين على إدراج وأنت لا يمكن إيقاف هذا. ولكن هل [عدل] ليست قادرة على استخدام INSERT تؤخر. لقد قرأت للتو هذا غير متوفر على ك InnoDB.

http://dev.mysql.com/doc /refman/5.0/en/insert-delayed.html

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

http://dev.mysql.com/doc /refman/5.0/en/lock-tables.html

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