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

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

المعاملات والنزاع حول البيانات

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

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

يحل 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 عناصر تحكّم في التزامن متفائلة ومتشائمة لحل الخلاف.

عزل ضمن معاملة

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

مشكلات تتعلق بالنزاع حول البيانات

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