0Pricing
SQL Academy · درس

مستويات العزل: READ COMMITTED وREPEATABLE READ وSERIALIZABLE

قارن مستويات العزل في معيار SQL بتطبيق PostgreSQL لها، واختر المستوى المناسب لحمل العمل لديك

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

أربعة مستويات قياسية

يحدد معيار SQL أربعة مستويات للعزل:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

تطبّق PostgreSQL ثلاثة منها (إذ يتصرف READ UNCOMMITTED مثل READ COMMITTED).

READ COMMITTED (الافتراضي في PostgreSQL)

ترى كل عبارة البيانات التي تم اعتمادها قبل بدء العبارة. وقد ترون لقطات مختلفة ضمن المعاملة الواحدة.

-- Inside one transaction:
SELECT balance FROM accounts WHERE id = 1;  -- 100
-- meanwhile another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1;  -- 200  (non-repeatable read)

REPEATABLE READ (عزل اللقطات)

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

BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1;  -- 100
-- another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1;  -- still 100
COMMIT;

SERIALIZABLE

أقوى المستويات: تتصرف المعاملات كما لو أنها نُفذت واحدة تلو الأخرى. تستخدم PostgreSQL تقنية Serializable Snapshot Isolation (SSI)، إذ تكتشف التبعيات المتزامنة وتُجهض المعاملات المتعارضة:

BEGIN ISOLATION LEVEL SERIALIZABLE;
...
COMMIT;
-- ERROR: could not serialize access due to read/write dependencies

تعيين مستوى العزل

يمكن التعيين لكل معاملة، أو لكل جلسة، أو على مستوى النظام بأكمله:

-- Per transaction:
BEGIN ISOLATION LEVEL SERIALIZABLE;

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

-- Default for new transactions in this session:
SET default_transaction_isolation = 'repeatable read';

-- Global default in postgresql.conf:
-- default_transaction_isolation = 'read committed'

الحالات المسموح بها في كل مستوى

المستوىمتسخةغير قابلة للتكراروهمية
READ UNCOMMITTEDربماربماربما
READ COMMITTEDلاربماربما
REPEATABLE READلالالا (في PG)
SERIALIZABLEلالالا

مقايضات الأداء

  • READ COMMITTED — أقل تكلفة إضافية، وهو الافتراضي
  • REPEATABLE READ — الخطة نفسها واتساق اللقطة، من دون تأثير في الأداء إلا عند تعارض عمليات الكتابة
  • SERIALIZABLE — يحتاج إلى تتبع إضافي، وقد يُجهض المعاملات؛ لذلك يلزم منطق لإعادة المحاولة في التطبيق

نمط إعادة المحاولة مع Serializable

قد يُجهض SERIALIZABLE المعاملة بالرمز 40001. أعيدوا المحاولة ضمن حلقة:

for (let i = 0; i < 3; i++) {
  try {
    await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
    // ... work ...
    await client.query('COMMIT');
    break;
  } catch (e) {
    if (e.code === '40001') continue;
    throw e;
  }
}

قراءة لقطة متسقة

للاستعلامات التحليلية طويلة المدة التي تحتاج إلى بيانات متسقة، يُعد REPEATABLE READ الخيار المتوازن.

سلوك تعارض الكتابة

إذا عدّلت معاملتان الصف نفسه:

  • READ COMMITTED — تنتظر المعاملة الثانية، ثم تعيد قراءة الصف الجديد وتحاول مرة أخرى
  • REPEATABLE READ — تُجهض المعاملة الثانية برسالة "could not serialize" — ويجب على التطبيق إعادة المحاولة

اختيار المستوى المناسب

إرشادات عامة:

  • OLTP — READ COMMITTED (الافتراضي)
  • التقارير التي تحتاج إلى الاتساق — REPEATABLE READ
  • الأموال / المخزون — SERIALIZABLE مع إعادة المحاولة، أو الأقفال الصريحة (FOR UPDATE)

تتفوّق الأقفال الصريحة على العزل أحيانًا

غالبًا ما يكون استخدام SELECT ... FOR UPDATE مع READ COMMITTED أبسط من SERIALIZABLE عند التعامل مع صف واحد كثير التنافس.

مراجعة

توازن مستويات العزل بين الأمان والتزامن.

  • READ COMMITTED هو الافتراضي
  • REPEATABLE READ للقراءات المتسقة
  • SERIALIZABLE للتنفيذ "كما لو كان تسلسليًا" — ويحتاج إلى منطق لإعادة المحاولة

تحقق سريع

ما مستوى العزل الافتراضي في PostgreSQL؟

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

هل درس «مستويات العزل: READ COMMITTED وREPEATABLE READ وSERIALIZABLE» مجاني؟

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

ماذا ستتعلم في «مستويات العزل: READ COMMITTED وREPEATABLE READ وSERIALIZABLE»؟

قارن مستويات العزل في معيار SQL بتطبيق PostgreSQL لها، واختر المستوى المناسب لحمل العمل لديك تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

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

كم من الوقت يستغرق درس «مستويات العزل: READ COMMITTED وREPEATABLE READ وSERIALIZABLE»؟

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

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

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

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

  1. خصائص ACID والحالات الشاذة
  2. مستويات العزل: READ COMMITTED وREPEATABLE READ وSERIALIZABLE
  3. حالات الجمود: الكشف والتجنب
  4. القفل التفاؤلي مقابل القفل التشاؤمي
← العودة إلى SQL Academy