شرح صفوف ومحتوى الفقرة
عندما تقفل الجلسة الأولى الصف (أ) وتنتظر الصف (ب)، بينما تقفل الجلسة الثانية الصف (ب) وتنتظر الصف (أ)، تنشأ حلقة انتظار دائرية تُسمى الإقفال المتبادل (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;