توضّح هذه الصفحة تعارض البيانات المعاملاتية وقابلية التسلسل والعزل. للاطّلاع على أمثلة على رموز المعاملات، يُرجى الاطّلاع على المعاملات وعمليات الكتابة المجمّعة بدلاً من ذلك.
المعاملات وتعارض البيانات
لكي تنجح المعاملة، يجب أن تظل المستندات التي يتم استردادها من خلال عمليات القراءة غير معدَّلة بواسطة عمليات خارج المعاملة. إذا حاولت عملية أخرى تغيير أحد هذه المستندات، ستدخل هذه العملية في حالة تعارض البيانات مع المعاملة.
- تضارب البيانات
- عندما تتنافس عمليتان أو أكثر للتحكّم في المستند نفسه على سبيل المثال، قد تتطلّب إحدى المعاملات أن يظل المستند متسقًا بينما تحاول عملية متزامنة تعديل قيم حقول هذا المستند.
تحلّ Cloud Firestore مشكلة تعارض البيانات عن طريق تأخير إحدى العمليتين أو إيقافها. تعيد مكتبات Cloud Firestore المحيطة بالمستودع تلقائيًا محاولة تنفيذ المعاملات التي يتعذّر إجراؤها بسبب تعارض البيانات. بعد عدد محدود من عمليات إعادة المحاولة، تتعذّر عملية المعاملة ويتم عرض رسالة خطأ:
ABORTED: Too much contention on these documents. Please try again.
عند تحديد العملية التي يجب إيقافها أو تأخيرها، يعتمد السلوك على نوع عناصر التحكّم في التزامن.
عناصر التحكّم في التزامن
وضع التزامن هو أحد خيارات قاعدة البيانات القابلة للضبط. تتوافق Cloud Firestore مع أوضاع التشغيل المتزامن التالية:
PESSIMISTIC: تفترض عناصر التحكّم المتزامنة المتشائمة أنّ هناك احتمالاً لحدوث تعارض في البيانات. تستخدم المعاملات المتشائمة أقفال قاعدة البيانات لمنع العمليات الأخرى من تعديل البيانات.باستخدام عناصر التحكّم المتزامنة المتشائمة، تضع المعاملات أقفالاً على المستندات التي تقرأها. يمنع قفل المعاملة على مستند المعاملات الأخرى وعمليات الكتابة المجمّعة وعمليات الكتابة غير المعاملات من تغيير هذا المستند. تؤدي المعاملة إلى تحرير أقفال المستندات في وقت التنفيذ. ويتم أيضًا إلغاء عمليات القفل إذا انتهت المهلة أو حدث خطأ لأي سبب.
عندما تقفل معاملة مستندًا، يجب أن تنتظر عمليات الكتابة الأخرى إلى أن تفتح المعاملة قفلها. تكتسب المعاملات عمليات الإغلاق بترتيب زمني.
OPTIMISTIC: تفترض عناصر التحكّم في التزامن المتفائل أنّ تعارض البيانات غير محتمل أو أنّه ليس من الفعّال الاحتفاظ بأقفال قاعدة البيانات. لا تستخدم المعاملات المتفائلة عمليات قفل قاعدة البيانات لمنع العمليات الأخرى من تغيير البياناتباستخدام عناصر التحكّم في التزامن المتفائل، تتتبّع المعاملة جميع المستندات التي تقرأها داخل المعاملة. تُكمل المعاملة عمليات الكتابة فقط إذا لم يتم تغيير أي من هذه المستندات أثناء تنفيذ المعاملة. إذا تم تغيير أي مستند، يعيد معالج المعاملات محاولة تنفيذ المعاملة. إذا تعذّر الحصول على نتيجة واضحة للمعاملة بعد عدة محاولات، ستفشل المعاملة بسبب تعارض البيانات.
الإعدادات التلقائية لوضع التزامن
القيمة التلقائية لإصدار Standard هي PESSIMISTIC. القيمة التلقائية لإصدار Enterprise هي OPTIMISTIC. ومع ذلك، يعتمد السلوك أيضًا على نوع مكتبة البرامج:
تستخدم حِزم تطوير البرامج (SDK) على الأجهزة الجوّالة والويب عناصر تحكّم متزامنة متفائلة. تعمل حِزم تطوير البرامج (SDK) للأجهزة الجوّالة والويب بشكل مستقل عن هذا الإعداد، لأنّها تحاكي دائمًا التزامن المتفائل.
تستخدم مكتبات برامج الخادم والعميل عناصر التحكّم المتزامنة في إعدادات قاعدة البيانات.
تعارض البيانات في حِزم 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 عناصر التحكّم المتزامنة المتفائلة والمتشائمة لحلّ التعارض.
العزل ضمن المعاملة
ينطبق الفصل بين العمليات أيضًا على عمليات الكتابة ضمن إحدى المعاملات. لا يمكن للطلبات وعمليات القراءة داخل إحدى المعاملات الاطّلاع على نتائج عمليات الكتابة السابقة داخل تلك المعاملة. حتى إذا عدّلت مستندًا أو حذفته ضمن معاملة، ستعرض جميع عمليات قراءة المستند في تلك المعاملة نسخة المستند في وقت التنفيذ، أي قبل عمليات الكتابة في المعاملة. لا تعرض عمليات القراءة أي نتائج إذا لم يكن المستند متوفّرًا في ذلك الوقت.
مشاكل متعلّقة بتعارض البيانات
لمزيد من المعلومات حول تعارض البيانات وكيفية حلّها، يمكنك الاطّلاع على صفحة تحديد المشاكل وحلّها.