محتويات الدورة

MySQL / التزامن والأداء والتشغيل / الدرس 13

الأقفال والانتظار والتعافي من التعارض الدائري

افهم ملكية الأقفال المتزامنة وأعد العملية التجارية كاملة ضمن حدود إعادة محاولة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • ميّز أقفال الصفوف والفجوات والمفتاح التالي والبيانات الوصفية.
  • شخّص الانتظار وصمم إعادة آمنة للتعارض الدائري.

تنتمي الأقفال إلى المعاملات

استخدم جلستين على نسخة مؤقتة من المتجر فقط. تحتاج SELECT ... FOR UPDATE إلى معاملة صريحة لحماية عملية لاحقة. قد يقفل البحث بمفتاح فريد السجل الموجود، بينما قد يأخذ النطاق مع REPEATABLE READ أقفال المفتاح التالي للسجلات والفجوات. لذلك يؤثر مسار الوصول في الأداء والتزامن معاً.

راقب انتظار حجب عادي

ليس كل انتظار تعارضاً دائرياً. قد تحمل معاملة صفاً وتنتظرها أخرى دون دورة. اختصر المعاملة المالكة واعرف كيف تنتهي. وتحمي أقفال البيانات الوصفية تعريفات الجداول مستقلة عن أقفال الصفوف؛ وقد تؤخر معاملة طويلة DDL بعد انتهاء SELECT. لا يحل رفع المهلة سبب الملكية ولا يقصر الحاجب.

sql فشل فوري بدلاً من الانتظار
-- Session A
START TRANSACTION;
SELECT id,stock FROM products WHERE id=1 FOR UPDATE;
-- Session B, while A remains open
START TRANSACTION;
SELECT id,stock FROM products WHERE id=1 FOR UPDATE NOWAIT;
ROLLBACK;
-- Session A
ROLLBACK;
الناتج المتوقع
Session A: id=1, stock=20
Session B: ERROR 3572 (HY000): Do not wait for lock.

تقرأ A الصف 1/20 وتحمل قفله. تفشل B بالرسالة ERROR 3572 (HY000): Do not wait for lock. وتلغي ROLLBACK محاولتها، ثم تحرر A قفلها. تغير NOWAIT انتظار أقفال الصفوف ولا تضمن انعدام انتظار كل أنواع الأقفال.

يحتاج التعارض الدائري إلى دورة

إذا حملت A المنتج 1 وطلبت 2 بينما حملت B المنتج 2 وطلبت 1 فلن تتقدم أي منهما. يكتشف InnoDB الدورة عادة ويلغي معاملة ضحية. ولا يضمن اختيار الضحية أولوية تجارية. يجب أن يتحمل التطبيق ذلك ويلغي المحاولة المتروكة ويعيد المعاملة كاملة فقط حين تسمح الآثار الخارجية وهوية الطلب بإعادة آمنة.

sql قراءة الانتظارات الحالية وأحدث دليل تعارض
SELECT REQUESTING_ENGINE_TRANSACTION_ID,
       BLOCKING_ENGINE_TRANSACTION_ID
FROM performance_schema.data_lock_waits;
SHOW ENGINE INNODB STATUS;

جدول الانتظار لقطة آنية وقد يكون فارغاً بعد حل التعارض. وقد يتضمن تقرير InnoDB أحدث دورة وعباراتها وضحيتها. تحتاج أدوات التشخيص إلى صلاحيات مناسبة وقد تكشف نص SQL؛ فاجمع الأدلة الضرورية فقط عبر قناة تشغيل مصرح بها.

حدّ الإعادات واحفظ الهوية

أعد الضحية بتأخير متزايد محدود وعشوائية، مع مهلة طلب وحد للمحاولات. أعد قراءة الحالة في كل معاملة جديدة ولا تستخدم قرارات قديمة. يلغي انتهاء انتظار القفل الأمر عادة افتراضياً، بخلاف إلغاء معاملة الضحية؛ فألغ محاولة العمل الفاشلة كلها صراحة. احفظ مفتاح عدم تكرار لمنع تكرار الطلب عند COMMIT مجهولة أوأثر خارجي.

خفف التنافس دون فقد الصحة

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

الأخطاء الشائعة وإصلاحها

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction.

لماذا يحدث؟
أخذت معاملات متزامنة موارد متداخلة في دورة.
كيف تصلحه؟
أعد الوحدة الكاملة الآمنة ضمن سياسة محدودة بعد التنظيف.
كيف تتجنب تكراره؟
استخدم ترتيب أقفال ثابتاً وافحص أنماط الدورات المتكررة.

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction.

لماذا يحدث؟
تجاوز طلب القفل المهلة وقد لا توجد دورة.
كيف تصلحه؟
ألغ محاولة العمل المتروكة وشخّص حاجبها.
كيف تتجنب تكراره؟
راقب المعاملات الطويلة وحدد ميزانية لعمرها.

تجعل SKIP LOCKED منتجاً يبدو مفقوداً.

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

اختبر فهمك

1. تحتاج معاملتان إلى المنتجين 1 و 2؛ اقترح ترتيباً مشتركاً.

اعرض الحل المشروح

اجعل الجميع يأخذ المنتج 1 قبل 2 أويرتب الأرقام المطلوبة تصاعدياً قبل القفل. يزيل ذلك دورة الترتيب المعاكس المحددة، لكن قد تنشئ فهارس وقيود وموارد أخرى دورات، فتظل الإعادات المحدودة لازمة.

2. لماذا قد يكون data_lock_waits فارغاً بعد ERROR1213؟

اعرض الحل المشروح

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

أهم ما تعلمته

  • ميّز الانتظار وانتهاء المهلة وإلغاء الضحية.
  • استخدم معاملات قصيرة مرتبة وإعادات محدودة آمنة من التكرار.

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