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

أهلاً بكم. فلاديسلاف رودين على اتصال. أنا حاليًا قائد الدورة التدريبية لدورة مهندس عبء العمل العالي في OTUS وأقوم أيضًا بتدريس دورات هندسة البرمجيات.

بالإضافة إلى التدريس، كما لاحظتم، أقوم بكتابة مادة أصلية لمدونة OTUS على حبري وأريد أن تتزامن مع مقال اليوم ليتزامن مع إطلاق الدورة "بوستغريسكل"، وهو مفتوح للتسجيل الآن.

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

مقدمة

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

العزل

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

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

الكتابة القذرة

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

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

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

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

قراءة قذرة

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

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

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

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

التحديث المفقود

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

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

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

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

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

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

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

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

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

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

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

القراءة الوهمية

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

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

على سبيل المثال، يمكننا ملاحظة الاختيار غير الصحيح للمنتج الأرخص عند حدوث هذا الوضع الشاذ.

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

قراءة الانحراف

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

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

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

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

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

نتيجة للمعاملة T1، يكون للمنشور عنوان = جيد، وupdate_by = T2، وهو نوع من عدم الاتساق.

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

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

اكتب انحراف

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

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

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

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

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

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

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

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

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

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

النتائج

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

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

المصدر: www.habr.com

إضافة تعليق