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

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

المعاملات وتعارض البيانات

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

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

تعمل 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

where:

  • 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 عناصر التحكّم في التزامن المتفائل والمتشائم لحلّ التعارض.

العزل ضمن المعاملة

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

مشاكل متعلّقة بتعارض البيانات

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