MySQL / دليل حلول تحريري

التعارض الدائري وانتظار الأقفال: التشخيص قبل الإعادة

استخدم أدلة أقفال للقراءة وميّز نطاق التراجع وحدّ إعادة العملية التجارية كاملة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction. اكتشف InnoDB دورة وألغى عادة معاملة الضحية. وليست الضحية بالضرورة الأحدث أوالأكثر ضرراً تجارياً.

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction. تجاوز الانتظار حده ولا يثبت دورة. وفق الإعداد الافتراضي يُلغى الأمر المنتظر لا كل كتابات العملية السابقة تلقائياً.

افهم الأسباب المحتملة

  • ينشئ الترتيب المعاكس دورة؛ تحمل A المنتج 1 وتطلب 2 بينما تحمل B المنتج 2 وتطلب 1. وقد تضيف النطاقات والمفاتيح الخارجية وصيانة الفهارس موارد أقل وضوحاً.
  • قد تسبب المعاملات الطويلة والاتصالات البعيدة داخلها والشروط غير المفهرسة والجلسات الخاملة المالكة للأقفال انتظاراً دون دورة. وتختلف أقفال البيانات الوصفية وقد تؤخر DDL.

اجمع حادثة مترابطة بأقل بيانات

استهدف MySQL8.4 InnoDB عبر اتصال تشخيص مصرح قائم فقط. سجل الرمز والوقت والطلب وحد المعاملة والعزل والموارد، واحجب القيم الشخصية. لا تستخدم KILL أوتغير المهلات العامة أوتعطل كشف التعارض لجمع الأدلة؛ فهذه تدخلات تشغيلية تحتاج سياقاً مدروساً.

افحص علاقات الانتظار الحالية

اقرأ معرّفات الطالب والحاجب واربطها بعمر المعاملة ومالك الاتصال. الجداول لقطات آنية وقد يكون التعارض حُلّ قبل الفحص. لذا لا ينفي جدول فارغ ERROR1213 المسجلة. تتطلب القراءة صلاحيات تشخيص مناسبة.

sql قراءة الانتظارات وأعمار المعاملات
SELECT REQUESTING_ENGINE_TRANSACTION_ID,
       BLOCKING_ENGINE_TRANSACTION_ID
FROM performance_schema.data_lock_waits;
SELECT trx_id,trx_state,trx_started,trx_wait_started,trx_mysql_thread_id
FROM information_schema.innodb_trx ORDER BY trx_started;

لا نفترض نتائج ثابتة لأن التوقيت يحدد الصفوف. افحص مالك الحاجب ودورة حياته قبل اقتراح إنهائه؛ فقد تنتهي عبارته المرئية وتبقى المعاملة مالكة للأقفال.

افحص الدليل السابق ونطاق التراجع

قد تعرض SHOW ENGINE INNODB STATUS أحدث تعارض وضحيته. افحص اختلاف سلوك تراجع المهلة عن الافتراضي قبل تحليل المحاولة الفاشلة. قد يكشف التقرير SQL وتفاصيل البنية، فاحتفظ بالأدلة الضرورية المقيدة فقط.

sql فحص إعداد التراجع دون تغييره
SHOW ENGINE INNODB STATUS;
SELECT @@GLOBAL.innodb_rollback_on_timeout AS rollback_on_timeout,
       @@GLOBAL.innodb_deadlock_detect AS deadlock_detection;

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

صحح الترتيب وأعد الوحدة الصحيحة

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

تحقق من نجاح الإصلاح

تدرّب على التطبيق المصحح بمختبر مؤقت بجلستين. تحقق من ترتيب الأقفال والتراجع الكامل وحد الإعادات وعدم تكرار طلب للمفتاح نفسه. افحص المخزون والبنود بعد التنافس وراقب معدلات الأخطاء بدلاً من توقع اختفاء كل تعارض.

امنع تكرار المشكلة

  • حدد عمر المعاملات وسجل معرّفات المحاولات والانتظار وافحص شروط الكتابة ووثق الملكية. قد يغير رفع المهلات أوخفض العزل الأعراض ويبقي الثابت غير آمن؛ قيّمها مستقلة.

المراجع الرسمية