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