0Pricing
Coding Interview Prep · درس

مستويات العزل الأربعة

من Read Uncommitted إلى Serializable وما يسمح به كل مستوى

مستويات العزل الأربعة درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

السؤال الكامن وراء السؤال

عندما يسأل المحاور "اذكر مستويات العزل الأربعة"، فإن الاختبار الحقيقي هو قدرتكم على شرح الموازنة: فالعزل الأقوى يعني حالات شاذة أقل، لكنه يعني تزامنًا أقل.

يحدد معيار SQL أربعة مستويات مرتبة من الأضعف إلى الأقوى:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

يسمح كل مستوى بمجموعة محددة من حالات شذوذ القراءة أو يمنعها. يتناول هذا الدرس المستويات، بينما يتناول الدرس التالي حالات الشذوذ بالتفصيل.

ضبط مستوى العزل

تضبطون العزل لكل معاملة أو لكل جلسة. وتكاد تكون الصياغة متطابقة بين المحركات المختلفة.

إذا لم تضبطوه، فلكل قاعدة بيانات مستوى افتراضي. ومعرفة المستويات الافتراضية سؤال شائع في المقابلات، لذلك سنتناولها في النهاية.

-- Per transaction (standard SQL)
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- ... statements ...
COMMIT;

-- Per session
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

المستوى 1: READ UNCOMMITTED

يُعد READ UNCOMMITTED أضعف مستوى. إذ يمكن للمعاملة قراءة صفوف عدلتها معاملة أخرى لكنها لم تثبتها بعد. وتُسمى هذه القراءات القذرة.

إذا تراجعت المعاملة الأخرى، فستكونون قد قرأتم بيانات لم توجد رسميًا قط. وهذا خطر على كل ما يتطلب الدقة.

ملاحظة: يعامل Postgres‏ READ UNCOMMITTED بالطريقة نفسها التي يعامل بها READ COMMITTED، لذلك لا ينفذ قراءات قذرة فعلية. أما SQL Server وMySQL فيطبقان هذا المستوى فعليًا.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN;
-- may see another transaction's uncommitted (dirty) rows
SELECT balance FROM accounts WHERE id = 1;
COMMIT;

المستوى 2: READ COMMITTED

يضمن READ COMMITTED أنكم لا تقرؤون إلا بيانات تم تثبيتها. فلا توجد قراءات قذرة.

لكن كل عبارة ترى أحدث لقطة مثبتة. فإذا نفذتم الاستعلام نفسه مرتين في معاملة واحدة، فقد تغير معاملة أخرى مثبّتة النتيجة بين التنفيذين. وتُسمى هذه الحالة الشاذة القراءة غير القابلة للتكرار.

وهذا هو المستوى الافتراضي في Postgres وOracle وSQL Server، كما أنه توازن مناسب لمعظم التطبيقات.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- returns 500
-- another transaction commits an update to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- may now return 700
COMMIT;

المستوى 3: REPEATABLE READ

يضمن REPEATABLE READ أنكم إذا قرأتم صفًا مرتين في المعاملة نفسها، فستحصلون على القيمة نفسها في المرتين. إذ يأخذ لقطة متسقة عند بدء المعاملة.

ويمنع القراءات القذرة والقراءات غير القابلة للتكرار. لكن المعيار لا يزال يسمح بالقراءات الوهمية: وهي صفوف جديدة تطابق شرط WHERE وتظهر عند إعادة الاستعلام.

مهم: هذا هو المستوى الافتراضي في MySQL/InnoDB، كما أن تطبيق InnoDB يحجب معظم القراءات الوهمية باستخدام أقفال المفتاح التالي.

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT balance FROM accounts WHERE id = 1;  -- 500
-- another transaction commits a change to id = 1
SELECT balance FROM accounts WHERE id = 1;  -- still 500 in this txn
COMMIT;

المستوى 4: SERIALIZABLE

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

ويمنع القراءات القذرة، والقراءات غير القابلة للتكرار، والقراءات الوهمية. لكن التكلفة هي استخدام مزيد من الأقفال أو، في Postgres، إلغاء المعاملات بسبب فشل التسلسل، وهو ما يتطلب إعادة المحاولة.

صياغة مناسبة للمقابلة: "يمنح SERIALIZABLE وهم تشغيل كل معاملة بمفردها، مقابل انخفاض التزامن واحتمال الحاجة إلى إعادة المحاولة."

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT SUM(balance) FROM accounts;
INSERT INTO audit (total) VALUES (...);
COMMIT;  -- may raise a serialization_failure you retry

مصفوفة الحالات الشاذة

أهم ما ينبغي حفظه هو الحالة الشاذة التي يسمح بها كل مستوى. وتعني كلمة "نعم" إمكانية حدوث الحالة الشاذة.

  • READ UNCOMMITTED: القراءة القذرة=نعم، القراءة غير القابلة للتكرار=نعم، القراءة الوهمية=نعم
  • READ COMMITTED: القراءة القذرة=لا، القراءة غير القابلة للتكرار=نعم، القراءة الوهمية=نعم
  • REPEATABLE READ: القراءة القذرة=لا، القراءة غير القابلة للتكرار=لا، القراءة الوهمية=نعم (وفقًا للمعيار)
  • SERIALIZABLE: القراءة القذرة=لا، القراءة غير القابلة للتكرار=لا، القراءة الوهمية=لا

يمنع كل ارتفاع في المستوى حالة شاذة إضافية. وهذا التدرج هو الإجابة كاملة.

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

تمييز مهم على مستوى الخبراء: يحدد معيار SQL المستويات وفق الحالات الشاذة التي يجب عليها منعها، لا وفق طريقة المنع. وغالبًا ما تمنع المحركات الفعلية حالات أكثر.

  • REPEATABLE READ في Postgres يستخدم عزل اللقطات ويحجب القراءات الوهمية أيضًا، مع أنه قد يظل عرضة لانحراف الكتابة.
  • REPEATABLE READ في MySQL/InnoDB يحجب القراءات الوهمية باستخدام أقفال المفتاح التالي.
  • SERIALIZABLE في Postgres يستخدم SSI (عزل اللقطات القابل للتسلسل)، ويلغي المعاملة عند التعارض بدلًا من استخدام أقفال كثيفة.

إن ذكر ذلك يوضح أنكم تعرفون أن المعيار يمثل حدًا أدنى، وليس السلوك الفعلي الدقيق.

المستويات الافتراضية حسب المحرك

تتكرر الأسئلة عن المستويات الافتراضية باستمرار. احفظوا الآتي:

  • PostgreSQL: READ COMMITTED
  • Oracle: READ COMMITTED (لا توجد قراءات قذرة مطلقًا)
  • SQL Server: READ COMMITTED
  • MySQL (InnoDB): REPEATABLE READ

يمثل MySQL الاستثناء الشائع، وهو من الأسئلة الخادعة المفضلة. إذا سُئلتم "ما مستوى العزل الافتراضي؟" فاستوضحوا المحرك أولًا.

اختيار مستوى عمليًا

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

  • استخدموا READ COMMITTED في المعالجة المعتادة للمعاملات (OLTP)؛ فهو سريع ويتجنب القراءات القذرة.
  • استخدموا REPEATABLE READ عندما تقرأ المعاملة البيانات نفسها عدة مرات ويجب أن تظل مستقرة، كما في التقارير والحسابات متعددة الخطوات.
  • استخدموا SERIALIZABLE للمنطق الحرج من ناحية الصحة، عندما تكون أي حالة شاذة غير مقبولة، وصمموا منطقًا لإعادة المحاولة عند إلغاء المعاملات.

يكاد لا يكون هناك سبب لاستخدام READ UNCOMMITTED في بيئة الإنتاج.

أسئلة متابعة شائعة

بعد أن تذكروا المستويات، يطرح المحاورون أسئلة متابعة سريعة. جهزوا إجابات واضحة ومباشرة:

  • "ما المستوى الذي يمنع القراءات القذرة لكنه يسمح بالقراءات غير القابلة للتكرار؟" READ COMMITTED.
  • "ما الحالة الشاذة الوحيدة التي لا يزال REPEATABLE READ يسمح بها وفقًا للمعيار؟" القراءات الوهمية.
  • "لماذا لا نستخدم SERIALIZABLE دائمًا؟" لأنه يقلل التزامن وقد يفرض إعادة محاولة المعاملة عند فشل التسلسل.
  • "هل تكلف المستويات الأعلى أكثر؟" نعم، سواء في تكلفة الأقفال أو في تكلفة الإلغاء وإعادة المحاولة.

تثبت الإجابة عن هذه الأسئلة فورًا أنكم استوعبتم التدرج ولم تحفظوه فقط.

اختبار سريع

هذه إحدى أكثر الحقائق المتعلقة بالمستوى الافتراضي ورودًا في الاختبارات.

مراجعة: أربعة مستويات وموازنة واحدة

تشكل مستويات العزل الأربعة تدرجًا من الأضعف إلى الأقوى: READ UNCOMMITTED، READ COMMITTED، REPEATABLE READ، SERIALIZABLE. ويمنع كل ارتفاع في المستوى حالة شاذة إضافية، من القراءات القذرة وغير القابلة للتكرار إلى القراءات الوهمية، مقابل انخفاض التزامن.

تذكروا المستويات الافتراضية: READ COMMITTED في كل مكان باستثناء REPEATABLE READ في MySQL، ولاحظوا أن المحركات الفعلية غالبًا ما تمنع حالات أكثر مما يتطلبه المعيار. بعد ذلك، ندرس حالات شذوذ القراءة الثلاث التي صُممت هذه المستويات لمنعها.

الأسئلة الشائعة

هل درس «مستويات العزل الأربعة» مجاني؟

نعم — نص درس «مستويات العزل الأربعة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «مستويات العزل الأربعة»؟

من Read Uncommitted إلى Serializable وما يسمح به كل مستوى تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «مستويات العزل الأربعة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. شرح خصائص ACID
  2. مستويات العزل الأربعة
  3. القراءات المتسخة وغير القابلة للتكرار والوهمية
  4. حالات التعارض والأقفال وMVCC
← العودة إلى Coding Interview Prep