تصف هذه الصفحة التنافس على البيانات في المعاملات، وإمكانية تسلسلها، وعزلها. للاطّلاع على نماذج رموز المعاملات، يمكنك بدلاً من ذلك الرجوع إلى المعاملات وعمليات الكتابة المجمّعة.
المعاملات والتنافس على البيانات
لكي تنجح المعاملة، يجب أن تظل المستندات التي تسترجعها عمليات القراءة فيها بدون تعديل من خلال عمليات خارج المعاملة. إذا حاولت عملية أخرى تغيير أحد هذه المستندات، ستدخل هذه العملية في حالة تنافس على البيانات مع المعاملة.
- التنافس على البيانات
- يحدث التنافس على البيانات عندما تتنافس عمليتان أو أكثر للتحكّم في المستند نفسه. على سبيل المثال، قد تتطلب إحدى المعاملات أن يظل المستند متسقًا بينما تحاول عملية متزامنة تعديل قيم حقول هذا المستند.
يحلّ 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 يستخدم عناصر التحكّم في التزامن المتفائل والمتشائم لحلّ التنافس.
العزل داخل المعاملة
ينطبق عزل المعاملة أيضًا على عمليات الكتابة داخل المعاملة. لا ترى طلبات البحث وعمليات القراءة داخل المعاملة نتائج عمليات الكتابة السابقة داخل تلك المعاملة. حتى إذا عدّلت مستندًا أو حذفْته داخل إحدى المعاملات، ستعرض جميع عمليات قراءة المستند في تلك المعاملة إصدار المستند في وقت الإكمال، قبل عمليات الكتابة في المعاملة. لا تعرض عمليات القراءة أي نتائج إذا لم يكن المستند موجودًا في ذلك الوقت.
المشاكل المتعلّقة بالتنافس على البيانات
لمزيد من المعلومات حول التنافس على البيانات وكيفية حلّ المشاكل المتعلّقة به، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.