تسلسل المعاملات وعزلها

توضّح هذه الصفحة تعارض البيانات المعاملاتية وإمكانية التسلسل والعزل. للاطّلاع على أمثلة على رموز المعاملات، يُرجى الرجوع إلى المعاملات وعمليات الكتابة المجمّعة بدلاً من ذلك.

المعاملات وتعارض البيانات

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

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

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

ABORTED: Too much contention on these documents. Please try again.

عند تحديد العملية التي سيتم إيقافها أو تأخيرها، يعتمد السلوك على نوع مكتبة العميل.

  • تستخدم حِزم تطوير البرامج (SDK) على الأجهزة الجوّالة والويب عناصر تحكّم متزامنة متفائلة.

  • تستخدم مكتبات برامج الخادم عناصر التحكّم المتزامنة المتشائمة.

تضارب البيانات في حِزم SDK للويب والأجهزة الجوّالة

تستخدم حِزم تطوير البرامج (SDK) للأجهزة الجوّالة/الويب (منصات Apple وAndroid والويب وC++) عناصر التحكّم في التزامن المتفائل لحلّ مشكلة تعارض البيانات.

عناصر التحكّم في التزامن المتفائل
استنادًا إلى افتراض أنّ تعارض البيانات غير محتمل أو أنّه ليس من الفعّال الاحتفاظ بأقفال قاعدة البيانات. لا تستخدم المعاملات المتفائلة أقفال قاعدة البيانات لمنع العمليات الأخرى من تغيير البيانات.

تستخدم حِزم تطوير البرامج (SDK) على الأجهزة الجوّالة والويب عناصر تحكّم متزامنة متفائلة، لأنّها يمكن أن تعمل في بيئات ذات وقت استجابة مرتفع واتصال شبكة غير موثوق به. سيؤدي قفل المستندات في بيئة ذات وقت استجابة طويل إلى حدوث الكثير من حالات فشل تنازع البيانات.

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

تضارب البيانات في مكتبات برامج الخادم والعميل

تستخدم مكتبات برامج الخادم (C#‎ وGo وJava وNode.js وPHP وPython وRuby) عناصر تحكّم متزامنة متشائمة لحلّ مشكلة تعارض البيانات.

عناصر التحكّم في التزامن المتشائم
استنادًا إلى افتراض أنّ تعارض البيانات أمر محتمل. تستخدم المعاملات المتشائمة أقفال قاعدة البيانات لمنع العمليات الأخرى من تعديل البيانات.

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

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

عندما تقفل معاملة مستندًا، يجب أن تنتظر عمليات الكتابة الأخرى إلى أن ترفع المعاملة القفل. تكتسب المعاملات عمليات الإقفال بالترتيب الزمني.

العزل القابل للتسلسل

تتعلّق مشكلة تعارض البيانات بين المعاملات بشكل وثيق بمستويات عزل قاعدة البيانات. يصف مستوى العزل لقاعدة البيانات مدى جودة تعامل النظام مع التعارضات بين العمليات المتزامنة. ينشأ التعارض من متطلبات قاعدة البيانات التالية:

  • تتطلّب المعاملات بيانات دقيقة ومتّسقة.
  • لاستخدام الموارد بكفاءة، تنفّذ قواعد البيانات العمليات بشكل متزامن.

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

تحدّد العزل التسلسلي أعلى مستوى للعزل. تعني العزلة القابلة للتسلسل ما يلي:

  • يمكنك افتراض أنّ قاعدة البيانات تنفّذ المعاملات على التوالي.
  • لا تتأثّر المعاملات بالتغييرات غير الملتزَم بها في العمليات المتزامنة.

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

تضمن Cloud Firestore الفصل بين العمليات بشكل متسلسل. يتم تسلسل المعاملات في Cloud Firestore وعزلها حسب وقت التنفيذ.

العزل التسلسلي حسب وقت التنفيذ

تحدّد Cloud Firestore وقت تنفيذ لكل معاملة يمثّل نقطة واحدة في الوقت. عندما Cloud Firestore تنفّذ تغييرات إحدى المعاملات في قاعدة البيانات، يمكنك افتراض أنّ جميع عمليات القراءة والكتابة ضمن المعاملة تحدث بالضبط في وقت التنفيذ.

يتطلّب التنفيذ الفعلي للمعاملة فترة زمنية معيّنة. يبدأ تنفيذ المعاملة قبل وقت التنفيذ، وقد يتداخل تنفيذ عمليات متعددة. تلتزم Cloud Firestore بمستوى العزل القابل للتسلسل وتضمن ما يلي:

  • تُجري Cloud Firestore المعاملات بالترتيب حسب وقت التنفيذ.
  • تعزل Cloud Firestore المعاملات عن العمليات المتزامنة التي يكون وقت تنفيذها لاحقًا.

في حال حدوث تعارض في البيانات بين العمليات المتزامنة، تستخدم Cloud Firestore عناصر التحكّم المتزامنة المتفائلة والمتشائمة لحلّ التعارض.

الفصل بين العمليات ضمن المعاملة

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

مشاكل متعلّقة بتعارض البيانات

لمزيد من المعلومات حول تعارض البيانات وكيفية حلّها، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.