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