معاملتان تقرآن رصيد مقعدين متاحين؛ كل واحدة ترى مقعدين وتحجز واحداً، ثم تنفذان commit. في ترتيب متداخل معين قد ينشأ قرار لا يشبه تشغيل المعاملتين بالتتابع. بدلاً من شرح العزل من قائمة تعريفات، تعرض مشاريع تخرج قواعد البيانات schedule لكل عملية وتوقف التنفيذ عند القراءة والكتابة والقفل. استعمل توثيق PostgreSQL لمستويات العزل ودليل الأقفال الصريحة لتحديد ما تحاكيه التجربة.

سيناريو مقاعد المناوبة

أنشئ جدولاً فيه طبيبان مناوبان وقيد عمل واحد: يجب أن يبقى طبيب واحد على الأقل متاحاً. تقرأ معاملتان عدد المتاحين، ثم تعطل كل واحدة صفاً مختلفاً. لو استند كل قرار إلى لقطة منفصلة فقد تكتب المعاملتان النتيجة لتصبح بلا طبيب متاح. هذا نموذج write skew تعليمي إذا صممت القيود والجدولة بعناية. اجعل العارض يسجل اتصالين منفصلين وأوامر SQL ووقت كل خطوة ونتيجة commit. لا تنفذ السيناريو على بيانات حقيقية، ولا تقدمه كتوصية تشغيلية للمناوبات أو كنموذج طبي.

اكتب الجدول كعمليات مرتبة: T1 BEGIN، T1 READ، T2 BEGIN، T2 READ، ثم writes وcommits. أنشئ schedule متسلسلاً مرجعياً وقارنه بجدول متداخل. لا تستنتج الشذوذ من اختلاف النتيجة فقط؛ حدد أي invariant خالفه الجدول وما مستوى العزل الذي جرى اختباره. أظهر لحظة انتظار القفل أو إلغاء إحدى المعاملتين كحدث مستقل.

تحكم في interleaving

شغل جلستين من عميلين مستقلين، وضع حاجزاً بعد القراءة حتى تنتظر المعاملتان قبل الكتابة. يوفر ذلك تكراراً للحالة بدلاً من الاعتماد على سباق توقيت عشوائي. ابدأ بـRead Committed وRepeatable Read ثم Serializable، وسجل مستوى العزل الذي ضبطته فعلياً لكل جلسة. إذا كانت المعاملة Serializable تتراجع بخطأ serialization، اعرضها كرفض مقصود للحفاظ على الضمان وليس كنجاح للطلب. أعد التجربة كاملة بعد التراجع؛ لا تكمل من نتائج القراءة القديمة. اجعل زر إعادة التشغيل يعيد البيانات إلى seed معروف، ويسجل نسخة PostgreSQL وإعدادات الاختبار.

ما الذي يراه الطالب؟

في المشهد الافتراضي تقرأ الجلسة A «متاحان»، وتقرأ الجلسة B القيمة نفسها. تعطّل A الصف الأول، وتعطل B الصف الثاني، ثم تحاولان commit. يعرض المختبر القيم قبل وبعد ووقت كل عملية، ويشير إلى أن النتيجة النهائية لا تحقق الشرط الأصلي. عند Serializable قد يرفض المحرك إحدى العمليتين، ثم يعيد التطبيق المعاملة بعد قراءة الحالة الجديدة. المثال يشرح تصور الاختبار ولا يضمن أن SQL المكتوب سيسبب anomaly كما هو دون تصميم مناسب؛ يجب تشغيله والتحقق من النتيجة الفعلية وتوثيقها قبل عرضها كتجربة.

استخدم أسماء الشذوذ بدقة

توثق مرجعية PostgreSQL 16 لمستويات العزل الفروق بين Read Committed وRepeatable Read وSerializable، وتشرح أن PostgreSQL يعيد خطأ serialization لبعض الجداول الخطرة في Serializable، وعلى التطبيق أن يكون مستعداً لإعادة المعاملة. بحث Berenson وزملائه عن مستويات العزل ناقش قصور التعريفات القائمة على أسماء anomalies وحدها. أما ورقة Serializable Snapshot Isolation in PostgreSQL فتشرح تصميم SSI. لا تخلط مصطلح phantom مع كل تعارض، ولا تنقل خصائص PostgreSQL إلى محرك قاعدة آخر.

خط الأساس ومصفوفة الفشل

خط الأساس تشغيل كل معاملة على حدة بالتسلسل، حيث يجب ألا يحدث التعارض. ثم كرر السيناريو المتزامن على كل مستوى عزل. اختبر serialization failure، deadlock إن أمكن بناءه، انقطاع اتصال قبل commit، وإعادة محاولة تكرر أثراً خارج قاعدة البيانات. أضف رسالة بريد أو سجل خارجي افتراضي لتوضيح أن rollback في SQL لا يلغي أثراً خارجياً تلقائياً. معيار النجاح ليس «كل المعاملات نجحت»، بل أن الحالة النهائية توافق القيد وأن الفشل يملك مسار retry محدوداً. سجل عدد مرات التراجع وزمن التنفيذ على جهاز الاختبار ولا تستنتج فرق أداء عام من تجربة واحدة.

الضمان لا يغطي منطق التطبيق كله

مستوى SERIALIZABLE في PostgreSQL لا يمنع الأخطاء البرمجية أو آثاراً خارج قاعدة البيانات، وقد يطلب إعادة المحاولة. يجب أن تكون إعادة التنفيذ آمنة idempotent أو محاطة بتصميم transactional outbox بحسب الحالة. سلوك المحركات ونسخها يختلف، كما أن البيانات التجريبية صغيرة ولا تمثل حجم الإنتاج. يسلم الفريق برنامج تشغيل صغيراً، وSQL للتهيئة، وجدول interleaving، وسجلات فعلية لكل مستوى عزل مع القيود. يناسب ذلك مشاريع التخرج في قواعد البيانات وهندسة البرمجيات؛ ويجب أن يذكر التقرير الإصدار ونص الخطأ الفعلي ولا يزعم إصلاح تنافسية أنظمة حقيقية.

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

المصادر

مراجعة المصادر: .

اختبار المثال وحدوده

الجدولة المتزامنة مثال تعليمي مقترح؛ يجب تشغيلها على قاعدة اختبار والتحقق من ناتج إصدار PostgreSQL المحدد.

مقالات ذات صلة

الخدمة المرتبطة: تطوير المشاريع البرمجية الجامعية.

أرسل متطلبات مشروعك