القفل التفاؤلي مقابل القفل التشاؤمي
قارن بين أنماط SELECT ... FOR UPDATE (التشاؤمي) وأنماط عمود الإصدار / WHERE updated_at = ? (التفاؤلي)
القفل التفاؤلي مقابل القفل التشاؤمي درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
استراتيجيتان للتزامن
- التشاؤمية — اقفلوا الصف عند قراءته، فلا يستطيع أي طرف آخر تغييره
- التفاؤلية — لا تستخدموا قفلًا؛ وعند التحديث، تحققوا من أن الصف لم يتغير
التشاؤمية: SELECT ... FOR UPDATE
اقفلوا الآن واكتبوا لاحقًا:
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- other transactions cannot lock or update this row
-- compute new balance...
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;FOR SHARE
قفل للقراءة — يمكن للآخرين القراءة، لكن لا يمكنهم الكتابة:
SELECT * FROM orders WHERE id = 1 FOR SHARE;
-- others can SELECT FOR SHARE but cannot UPDATEإيجابيات وسلبيات النهج التشاؤمي
الإيجابيات: سهل الفهم والتحليل، ولا يحتاج إلى إعادة محاولة.
السلبيات: يقلل التزامن، وقد يسبب الانتظار على الأقفال وحالات الجمود.
التفاؤلية: عمود الإصدار
اقرؤوا الصف مع الإصدار، واكتبوا باستخدام WHERE version = expected:
BEGIN;
SELECT id, balance, version FROM accounts WHERE id = 1;
-- compute new balance...
UPDATE accounts
SET balance = ?, version = version + 1
WHERE id = 1 AND version = ?;
-- check rows affected: 0 means someone else updated, retryالتفاؤلية مع updated_at
الفكرة نفسها، باستخدام updated_at بدلًا من عمود إصدار صريح:
UPDATE accounts
SET balance = ?, updated_at = NOW()
WHERE id = ? AND updated_at = ?;
-- If updated_at has changed in the meantime, 0 rows affected — retry.إيجابيات وسلبيات النهج التفاؤلي
الإيجابيات: تزامن عالٍ، ومن دون انتظار.
السلبيات: قد تفشل عمليات الكتابة وتحتاج إلى منطق لإعادة المحاولة؛ ولا يظهر التعارض إلا عند تنفيذ UPDATE.
متى تختارون النهج التشاؤمي
في الحالات التالية:
- المعاملات القصيرة مع تنافس عالٍ على الصفوف كثيرة الاستخدام
- تحويلات الأموال — إذ لا تريدون تنفيذ جزء من العملية فقط
- العمليات طويلة المدة التي يُحتمل فيها حدوث تعارض
متى تختارون النهج التفاؤلي
في الحالات التالية:
- أحمال العمل التي يغلب عليها القراءة وتندر فيها التعارضات
- واجهات API عديمة الحالة، حيث يحتفظ العميل بالصف بين الطلبات
- التعديلات على الهاتف المحمول أو دون اتصال، يتبعها إجراء مزامنة
نهج هجين: FOR UPDATE NOWAIT
حاولوا قفل الصف؛ وإذا كان مقفلاً، فافشلوا فورًا واتركوا للمستخدم إعادة المحاولة:
SELECT * FROM accounts WHERE id = 1 FOR UPDATE NOWAIT;
-- ERROR if someone else holds it — user sees a friendly retry messageالأقفال الإرشادية
أقفال على مستوى التطبيق لا ترتبط بأي صف:
SELECT pg_try_advisory_xact_lock(hashtext('order:42'));
-- True if you got the lock, false otherwise — useful for cross-row coordination.لا تنسوا فهرسة أهداف الأقفال
قد يؤدي استخدام FOR UPDATE من دون فهرس لعمود WHERE إلى قفل صفوف أكثر من المتوقع (إذ يقفل الصفوف التي يفحصها، لا الصفوف المطابقة فقط).
مهلات الأقفال
عيّنوا lock_timeout لتجنب الانتظار إلى أجل غير مسمى:
SET lock_timeout = '5s';
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- ERROR if lock not acquired in 5 secondsمراجعة
يقفل النهج التشاؤمي الصف، بينما يتحقق النهج التفاؤلي عند وقت الكتابة.
- التشاؤمي: FOR UPDATE — بسيط، لكنه يقلل التزامن
- التفاؤلي: عمود إصدار — يسمح بتزامن أكبر، لكنه يحتاج إلى إعادة المحاولة
- اختاروا النهج حسب حمل العمل، وادمجوا بينهما عند الحاجة
تحقق سريع
يكون إنقاص مخزون منتج في متجر إلكتروني محل تنافس شديد. ما استراتيجية الأقفال الأكثر أمانًا عمومًا؟
الأسئلة الشائعة
هل درس «القفل التفاؤلي مقابل القفل التشاؤمي» مجاني؟
نعم — نص درس «القفل التفاؤلي مقابل القفل التشاؤمي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «القفل التفاؤلي مقابل القفل التشاؤمي»؟
قارن بين أنماط SELECT ... FOR UPDATE (التشاؤمي) وأنماط عمود الإصدار / WHERE updated_at = ? (التفاؤلي) تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «القفل التفاؤلي مقابل القفل التشاؤمي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- خصائص ACID والحالات الشاذة
- مستويات العزل: READ COMMITTED وREPEATABLE READ وSERIALIZABLE
- حالات الجمود: الكشف والتجنب
- القفل التفاؤلي مقابل القفل التشاؤمي