MVCC كطريقة واحدة لضمان عزل المعاملات

مرحباً هابر. اسمي فلاديسلاف رودين. حاليا ، أنا رئيس دورة High Load Architect في OTUS ، كما أقوم بتدريس دورات حول هندسة البرمجيات.

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



المقدمة


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

الإصدارات


كما قلت ، فإن أحد الأساليب يعتمد على النسخ. ويطلق عليه أيضا متفائل نهج أو MVCC (multiversion التحكم التزامن) . في الواقع ، يحدث تخزين الإصدار للمعاملات النشطة.

أين يتم تخزين الإصدارات؟


يعتمد تنفيذ الآلية على قاعدة البيانات. سأعطي أمثلة على بعضها.

PostgreSQL


تتميز كل معاملة ببعض id-shnik. تنمو معاملات Id-shnik بشكل رتيب. يحتوي أي سطر على سمتين تمثلان المعلومات الوصفية لتوفير آلية: مُحدّث_معرّف_معرّف - معرّف المعاملة التي حدثت هذا السجل مؤخرًا ومُحذَف_معرّف - مُعرّف المعاملة التي حذفت هذا السجل. عند وصول معاملة جديدة ، تحدد قاعدة البيانات علامات التعريف للمعاملات التي يتم تنفيذها حاليًا ، وسيتم تجاهل التغييرات التي أجرتها هذه المعاملات داخل المعاملة الواردة. اتضح أن المعاملة الواردة تعمل كما لو كانت مع نسختها من البيانات. يتم تخزين الإصدارات القديمة من البيانات في نفس المكان الحالي. إذا وصل التحديث ، فسيتم إضافة سطر آخر ويصبح هذا السجل نشطًا. من الواضح أيضًا أنه من أجل التشغيل الصحيح لهذا المخطط ، يلزم "جامع القمامة":إذا قام بعض السجلات بحذف_by_id = 100 ، وكان الحد الأدنى id-shnik بين المعاملات الحالية هو 150 ، فيجب حذف هذا السجل.

MySQL (محرك InnoDB)


يتم تخزين الإصدار الحالي فقط في قاعدة بيانات MySQL. عند وصول التحديث ، يتم تصحيح البيانات الموجودة داخل ملف الجدول. بعد ضبط البيانات ، يكون الإصدار السابق في سجل التراجع. هناك العديد من سجلات التراجع في MySQL (تختلف عن insert'ov و update'ov). إذا كانت المعاملة بحاجة إلى إصدار سابق من الخط ، فسيقوم النظام بالتراجع عن السجل واستعادة الإصدار الضروري. يتم تحديد الإصدار أيضًا بواسطة معرف المعاملة.

وحي


يشبه المخطط MySQL: يتم تخزين الإصدارات الحالية في ملف البيانات ، ويتم استعادة الإصدارات القديمة بفضل سجل التراجع. تتم إعادة كتابة سجل التراجع في Oracle بشكل دوري. لذلك ، يكون الموقف ممكنًا عندما تحتاج المعاملة إلى إصدار قديم جدًا من السجل ، ولكنها لم تعد موجودة في سجل التراجع. في حالة حدوث هذا الموقف ، ستفشل المعاملة.

MS SQL


يسمح MS SQL بتضمين وضعي الإصدار و blocker. لتمكين وضع الإصدار في إعدادات قاعدة البيانات ، يجب تمكين اللقطات. في MS SQL يوجد جدول نظام (tempdb) ، وهو مصمم لتخزين الجداول المؤقتة. يتم استخدام tempdp لتخزين الإصدارات القديمة ، بينما يحتوي الجدول على الإصدارات الحالية. تراقب عملية النظام أنه في tempdb هناك إصدارات لا يشير إليها أحد ، يمكن حذفها. إذا كانت المعاملة طويلة ، فسيتم حفظ الإصدارات لها. ينمو Tempdb ، ويصل إلى حجمه الأقصى ، وتخصص MS SQL مساحة صغيرة على القرص. إذا انتهى ، فلا يمكن إجراء المعاملات بعزل اللقطة. إذا تم استخدام وضع التشغيل هذا ، فمن الضروري مراقبة المعاملات الطويلة ،لأن التراجع عن مثل هذه الصفقة في الوقت المناسب قد يكلف بقدر ما يعمل ، وربما أكثر قليلاً.

الصراعات


يُطلق على هذا النهج التفاؤل ، لأننا نأمل أنه لن يكون هناك تعارض في حالة تنفيذ معاملات موازية لتغيير البيانات. ماذا يحدث في حالة الصراع؟ افترض أن المعاملة T1 تغير 10000 سجل ، وتغير المعاملة T2 1 سجل بالتوازي. إذا حدث أن هذا الرقم 1 مدرج في تلك 10000 ، فسيتم إرجاع إحدى المعاملات إلى الوراء: إذا تم تنفيذ T1 أولاً ، فسيتم إرجاع T2 ، وإلا فإن العكس.

آلية التراجع


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

استنتاج


النهج المتفائل جيد لأن الكاتب لا يمنع القارئ ، ببساطة يقرأ القارئ نسخته من البيانات. لذلك ، يكون الإصدار مفيدًا إذا كان العبء الرئيسي على القراءة بدلاً من الكتابة (مدونة ، إعداد تقارير ، وحالات أخرى حيث تحتاج إلى القراءة كثيرًا والكثير).



تعرف على المزيد حول الدورة هنا.



All Articles