ما يمكن أن ينتج عن إضعاف مستوى عزل المعاملات في قواعد البيانات

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

بالإضافة إلى التدريس ، كما ترون ، لقد كنت أكتب لمدونة حقوق الطبع والنشر OTUS Habré ومقال اليوم الذي أريد أن يتزامن مع بداية الدورة «PostgreSQL» ، والتي هي الآن مفتوحة للمجموعة.




المقدمة


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


عازلة


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

أشهر الشذوذات هي: قراءة قذرة ، قراءة غير قابلة للتكرار ، قراءة فانتوم ، ولكن في الواقع هناك 5 أشياء أخرى: الكتابة القذرة ، التحديث المفقود للمؤشر ، التحديث المفقود ، قراءة الانحراف ، الكتابة الانحراف.

كتابة قذرة


جوهر الشذوذ هو أن المعاملات يمكن أن تحل محل البيانات غير الملتزمة.

صورة

هذا الوضع الشاذ خطير ليس فقط لأن البيانات قد تتعارض بعد تنفيذ كلتا المعاملتين (كما في الصورة) ، ولكن أيضًا بسبب انتهاك الذرية: نظرًا لأننا نسمح بالكتابة فوق البيانات غير المؤمنة ، فليس من الواضح كيفية استعادة إحدى المعاملات دون ضرب الأخرى .

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

قراءة قذرة


القراءة المتسخة تعني قراءة البيانات غير الملتزم بها.

صورة

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

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

تحديث مفقود


التحديث المفقود يعني فقدان التحديثات ، وتعكس الترجمة بدقة جوهر المشكلة:

صورة

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

فقد المؤشر التحديث


للتحكم الدقيق ، يمكن أن تقدم القواعد أدوات أخرى ، على سبيل المثال ، المؤشر. المؤشر عبارة عن هيكل يحتوي على مجموعة من الخطوط ويسمح لك بالتكرار فوقها. يعلن cursor_name عن select_statement . يتم وصف محتويات المؤشر من خلال التحديد.

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

قراءة غير قابلة للتكرار


القراءة غير القابلة للتكرار هي أنه أثناء تنفيذ معاملتنا ، ستؤدي قراءتان متتاليتان لنفس السجل إلى نتائج مختلفة ، لأن عملية أخرى تدخلت بين هاتين القراءتين ، غيرت بياناتنا وتم الالتزام بها.

صورة

لماذا هذه مشكلة على الإطلاق؟ تخيل أن الغرض من المعاملة T2 في الصورة هو تحديد جميع المنتجات التي يقل سعرها عن 150 متر مكعب قام شخص آخر بتحديث السعر إلى 200 دولار وبالتالي ، لم يعمل المرشح المثبت.

تتوقف هذه الحالات الشاذة عن الحدوث عند إضافة أقفال من مرحلتين أو عند استخدام آلية MVCC ، والتي أود التحدث عنها بشكل منفصل.

قراءة فانتوم


يقرأ Phantom البيانات التي تمت إضافتها بواسطة معاملة أخرى.

صورة

كمثال ، يمكنك ملاحظة الاختيار الخاطئ للمنتج الأرخص عند حدوث هذا الشذوذ.

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

اقرأ الانحراف


ينشأ انحراف القراءة عندما نعمل مع عدة جداول ، يجب أن يتغير محتواها بطريقة متسقة.

افترض أن هناك جداول تمثل المنشورات والمعلومات الوصفية الخاصة بها:

صورة

تقرأ إحدى المعاملات من الجداول ، وتغيرها أخرى:

صورة

نتيجة للمعاملة T1 ، يكون للمنشور عنوان = جيد ومحدَّث_من = T2 ، وهو بعض التناقض.

في الواقع ، هذه قراءة غير قابلة للتكرار ، ولكن كجزء من عدة جداول.

للتصحيح ، يمكن لـ T1 تعليق الأقفال على جميع الأسطر التي ستقرأها ، مما سيمنع T2 من تغيير المعلومات. في حالة MVCC ، سيتم إلغاء المعاملة T2. يمكن أن تصبح الحماية ضد هذا الشذوذ مهمة إذا استخدمنا المؤشرات.

اكتب الانحراف


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

صورة

صورة

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

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

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

صورة

صورة

ونتيجة لذلك ، نحصل على الصورة التالية: يعتقد كل مدير أن تغييره لن يؤدي إلى ميزانية ، لذلك قاموا بتغييرات في الموظفين ، مما أدى في المجمل إلى تجاوز.

سبب المشكلة هو نفسه تمامًا كما هو الحال في القراءة الوهمية.

الموجودات


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



تعلم المزيد عن الدورة.



All Articles