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

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

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

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

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

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

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

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

عناصر التحكّم في التزامن

وضع التزامن هو خيار قابل للإعداد في قاعدة البيانات. Cloud Firestore يتوافق مع أوضاع التزامن التالية:

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

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

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

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

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

الإعدادات التلقائية لوضع التزامن

الإعداد التلقائي لإصدار Standard هو PESSIMISTIC. الإعداد التلقائي لإصدار Enterprise هو OPTIMISTIC. ومع ذلك، يعتمد السلوك أيضًا على نوع مكتبة العميل:

  • تستخدم حِزم SDK للأجهزة الجوّالة والويب عناصر التحكّم في التزامن المتفائل. تتصرّف حِزم SDK للأجهزة الجوّالة والويب بشكلٍ مستقل عن هذا الإعداد لأنّها تحاكي دائمًا التزامن المتفائل.
  • تستخدم مكتبات عملاء الخادم عناصر التحكّم في التزامن لإعداد قاعدة البيانات.

عرض وضع التزامن

نفِّذ الأمر gcloud firestore databases describe لعرض وضع التزامن من جهة الخادم في قاعدة بياناتك:

gcloud firestore databases describe \
  --project=PROJECT_ID \
  --database=DATABASE_ID

تغيير وضع التزامن

نفِّذ الأمر gcloud firestore databases update لتغيير وضع التزامن من جهة الخادم في قاعدة بياناتك:

gcloud firestore databases update \
  --project=PROJECT_ID \
  --database=DATABASE_ID \
  --concurrency-mode=CONCURRENCY_MODE

حيث:

  • CONCURRENCY_MODE هو PESSIMISTIC أو OPTIMISTIC.
  • PROJECT_ID هو رقم تعريف مشروع Google Cloud.
  • DATABASE_ID هو رقم تعريف قاعدة بيانات Cloud Firestore.

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

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

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

التنازع على البيانات في مكتبات عملاء الخادم

تستخدم مكتبات عملاء الخادم (C# وGo وJava وNode.js وPHP وPython وRuby) ميزة المعاملات المضمّنة. تستخدم هذه المعاملات إعداد وضع التزامن على مستوى قاعدة البيانات، ويعتمد الإعداد التلقائي على الإصدار:

  • يستخدم إصدار Enterprise عناصر التحكّم في التزامن المتفائل تلقائيًا لدعم العمليات التي تجري عمليات فحص على مجموعات كاملة. تساعد عناصر التحكّم في التزامن المتفائل على تجنُّب عمليات الفحص التي تقفل عددًا كبيرًا من المستندات.

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

الفصل بين المعاملات بشكلٍ متسلسل

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

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

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

يحدّد الفصل بين المعاملات بشكلٍ متسلسل أعلى مستوى للفصل بين المعاملات. يعني الفصل بين المعاملات بشكلٍ متسلسل ما يلي:

  • يمكنك افتراض أنّ قاعدة البيانات تنفّذ المعاملات بشكلٍ متسلسل.
  • لا تتأثّر المعاملات بالتغييرات التي لم يتم إكمالها في العمليات المتزامنة.

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

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

الفصل بين المعاملات بشكلٍ متسلسل حسب وقت الإكمال

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

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

  • Cloud Firestore يُكمل المعاملات بترتيب وقت الإكمال.
  • Cloud Firestore يفصل المعاملات عن العمليات المتزامنة التي لها وقت إكمال لاحق.

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

الفصل بين العمليات داخل المعاملة

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

المشاكل المتعلّقة بالتنازع على البيانات

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