انتقل إلى محتوى الدرس

Handling Deadlocks and SKIP LOCKED الإقفال المتبادل و SKIP LOCKED

تعلّم مستويات عزل المعاملات وأقفال الصفوف في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
1 صفوف تعليمية
MySQL
7 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

عندما تقفل الجلسة الأولى الصف (أ) وتنتظر الصف (ب)، بينما تقفل الجلسة الثانية الصف (ب) وتنتظر الصف (أ)، تنشأ حلقة انتظار دائرية تُسمى الإقفال المتبادل (Deadlock). كما أن انتظار تحرير القفل لمدة 50 ثانية افتراضياً (innodb_lock_wait_timeout) يعطل طوابير المهام السريعة. يوفر MySQL 8 حلولاً هندسية حاسمة:

  • الكشف التلقائي عن الإقفال المتبادل: يكتشف محرك InnoDB حلقة الانتظار الدائرية فوراً ويتراجع عن المعاملة الأصغر حجماً مع إرجاع الخطأ ERROR 1213 (40001): Deadlock found لتتمكن من إعادة محاولتها برمجياً.
  • الوقاية من Deadlock: رتّب دائماً تعديل وقفل الصفوف بترتيب تصاعدي ثابت للمفتاح الأساسي (ORDER BY id ASC) في جميع المعاملات.
  • FOR UPDATE NOWAIT: يرفض الانتظار تماماً ويُرجع خطأ فورياً (ERROR 3572) إذا كان الصف مقفلاً من جلسة أخرى.
  • FOR UPDATE SKIP LOCKED: يتخطى أي صفوف مقفلة حالياً ويقفل أول صف متاح غير مقفل، وهو الحل المثالي لبناء طوابير معالجة المهام (Job Queues) المتوازية في MySQL 8.
SQL
START TRANSACTION;

SELECT job_id, payload, status
FROM job_queue
WHERE status = 'pending'
ORDER BY job_id ASC
LIMIT 1
FOR UPDATE SKIP LOCKED;
COMMIT;