المعاملات والتحكم المتفائل في التزامن
ينطبق على:
واجهة برمجة تطبيقات SQL
توفر معاملات قاعدة البيانات نموذج برمجة آمن، ويمكن التنبؤ به للتعامل مع التغييرات المتزامنة على البيانات. قواعد البيانات العلائقية التقليدية؛ مثل: خادم SQL، تسمح لك لكتابة منطق العمل باستخدام الإجراءات المخزنة و/ أو مشغلات، وإرسالها إلى الخادم للتنفيذ مباشرة داخل مشغل قاعدة البيانات. مع قواعد البيانات العلائقية التقليدية، يطلب منك التعامل مع لغتي برمجة مختلفتين لغة برمجة التطبيقات (غير المعاملات)؛ مثل: JavaScript، Python، C#، Java، إلخ، ولغة برمجة المعاملات (مثل: T-SQL)، التي يتم تنفيذها في الأصل من خلال قاعدة البيانات.
يدعم مشغل قاعدة البيانات في قاعدة بيانات Azure Cosmos معاملات ACID الكاملة (الذرية، والتناسق، والعزلة، والمتانة) المتوافقة مع عزل اللقطة. يتم تنفيذ كل عمليات قاعدة البيانات ضمن نطاق القسم المنطقي حاوية بشكل معاملات ضمن مشغل قاعدة البيانات التي يتم استضافتها من خلال النسخة المتماثلة من القسم. تتضمن هذه العمليات كل من الكتابة (تحديث عنصر واحد أو أكثر داخل القسم المنطقي)، وعمليات القراءة. يوضح الجدول التالي العمليات، وأنواع المعاملات المختلفة:
| التشغيل | نوع العملية | عملية فردية، أو متعددة العناصر |
|---|---|---|
| إدراج (دون مشغّل ما قبل/ بعد) | كتابة | عملية عنصر واحد |
| إدراج (مع مشغّل ما قبل/ بعد) | الكتابة والقراءة | عملية عناصر متعددة |
| استبدال (دون مشغّل ما قبل/ بعد) | كتابة | عملية عنصر واحد |
| استبدال (مع مشغّل ما قبل/ بعد) | الكتابة والقراءة | عملية عناصر متعددة |
| Upsert (دون مشغّل ما قبل/ بعد) | كتابة | عملية عنصر واحد |
| Upsert (مع مشغّل ما قبل/ بعد) | الكتابة والقراءة | عملية عناصر متعددة |
| حذف (دون مشغّل ما قبل/ بعد) | كتابة | عملية عنصر واحد |
| حذف (مع مشغّل ما قبل/ بعد) | الكتابة والقراءة | عملية عناصر متعددة |
| تنفيذ الإجراء المخزن | الكتابة والقراءة | عملية عناصر متعددة |
| بدأ النظام تنفيذ إجراء دمج | كتابة | عملية عناصر متعددة |
| بدأ النظام تنفيذ حذف العناصر استنادًا إلى انتهاء صلاحية (TTL) عنصر | كتابة | عملية عناصر متعددة |
| Read | Read | عملية عنصر واحد |
| موجز التغيير | Read | عملية عناصر متعددة |
| قراءة مُرقمة | Read | عملية عناصر متعددة |
| استعلام مُرقم | Read | عملية عناصر متعددة |
| تنفيذ UDF كجزء من الاستعلام المُرقم | Read | عملية عناصر متعددة |
عمليات عناصر متعددة
تسمح لك قاعدة بيانات Azure Cosmos بكتابة الإجراءات المخزنة ومشغلات ما قبل النشر، والوظائف المعرفة من خلال المستخدم (UDFs)، وإجراءات الدمج في JavaScript. تدعم قاعدة البيانات Azure Cosmos تنفيذ JavaScript داخل محرك قاعدة البيانات الخاص به. يمكنك تسجيل الإجراءات المخزنة، ما قبل/ بعد المشغلات، وظائف المعرفة من خلال المستخدم (UDFs)، ودمج الإجراءات على حاوية وتنفيذها لاحقًا بشكل المعاملات داخل مشغل قاعدة بيانات Azure Cosmos. كتابة منطق التطبيق في JavaScript يسمح التعبير الطبيعي للتحكم في التدفق، وتحديد النطاق المتغير، والتعيين، والتكامل بين الاستثناءات، والتعامل مع البدائيات داخل معاملات قاعدة البيانات مباشرة في لغة JavaScript.
يتم التفاف إجراءات تخزين JavaScript المستندة إلى مشغلات UDFs، وإجراءات دمج ضمن معاملة ACID المحيطة مع عزل لقطة عبر كل العناصر داخل القسم المنطقي. في سياق تنفيذها، إذا طرح برنامج JavaScript استثناء، يتم إحباط المعاملة بأكملها والتراجع. نموذج البرمجة الناتج بسيط؛ ولكنه قوي. يحصل مطوري JavaScript على نموذج برمجة دائم في حين لا يزالوا يستخدمون لغتهم المألوفة والمكتبة البدائية.
القدرة على تنفيذ JavaScript مباشرةً داخل مشغل قاعدة البيانات يوفر الأداء، وتنفيذ المعاملات من عمليات قاعدة البيانات ضد عناصر حاوية. علاوة على ذلك، بمّا أن محرك قاعدة بيانات Azure Cosmos يدعم في الأصل JSON وJavaScript، فلا يوجد عدم تطابق في المعاوقة بين أنظمة نوع التطبيق وقاعدة البيانات.
التحكم في التزامن غير المؤمن
يسمح لك تحكم التزامن غير المؤمن بمنع التحديثات، والحذف المفقود. التزامن، يتم عرض عمليات المتعارضة تأمين غير مؤمنة عادية لمشغل قاعدة البيانات التي استضافه القسم المنطقي الذي يملك العنصر. عند محاولة اثنين من العمليات المتزامنة لتحديث أحدث إصدار من عنصر ضمن قسم منطقي، يفوز واحد منهم، ويفشل الآخر. ورغم ذلك، إذا كانت عملية واحدة أو عمليتان تحاولان تحديث العنصر ذاته بشكل متزامن قد قرأت مسبقًا قيمة أقدم للعنصر، فإن قاعدة البيانات لا تعرف ما إذا كانت القيمة التي تمت قراءتها مسبقًا من خلال أي من العمليتين المتعارضتين أو كليهما هي بالفعل أحدث قيمة للعنصر . لحسن الحظ، يمكن الكشف عن هذا الموقف مع التحكم المتزامن غير المؤمن (OCC) قبل السماح للعمليات بإدخال حد المعاملة داخل مشغل قاعدة البيانات. يحمي التحكم المتزامن غير المُؤمن (OCC) بياناتك من الكتابة فوق التغييرات التي تم إجراؤها بواسطة الآخرين بطريق الخطأ. كما أنه يمنع الآخرين من الكتابة فوق التغييرات الخاصة بك عن طريق الخطأ.
تخضع التحديثات المتزامنة لأي عنصر إلى التحكم المتزامن غير المُؤمن (OCC) من خلال طبقة بروتوكول الاتصال الخاصة بقاعدة بيانات Azure Cosmos. فيما يتعلق بحسابات Azure Cosmos المكونة للكتابة في منطقة واحدة، تضمن قاعدة البيانات Azure Cosmos أن يكون الإصدار العميل من العنصر الذي تقوم بتحديثه (أو حذفه) هو نفس إصدار العنصر في حاوية Azure Cosmos. يضمن ذلك أن تكون كتاباتك محمية من الكتابة فوقها بطريق الخطأ من خلال كتابات الآخرين، والعكس بالعكس. في بيئة متعددة المستخدمين، يحميك عنصر التحكم في التزامن المثالي من حذف أو تحديث إصدار خاطئ من عنصر ما عن طريق الخطأ. على هذا النحو، يتم حماية العناصر ضد "التحديث المفقود" سيئ السمعة، أو "حذف المفقود" المشكلات.
في حساب Azure Cosmos الذي تم تكوينه مع عمليات الكتابة متعددة المناطق، يمكن الالتزام بالبيانات بشكل مستقل في المناطق الثانوية إذا تطابقت مع البيانات الموجودة في المنطقة _etag المحلية. بمجرد أن يتم الالتزام ببيانات جديدة محليًا في منطقة ثانوية، يتم دمجها بعد ذلك في لوحة الوصل، أو المنطقة الأساسية. إذا دمج نهج حل التعارض البيانات الجديدة في منطقة لوحة الوصل، فسيتم نسخ هذه البيانات بشكل عمومي مع الجديد_etag. إذا رفض نهج حل التعارض البيانات الجديدة، فسيتم التراجع عن المنطقة الثانوية إلى البيانات الأصلية و _etag.
كل عنصر مخزن في حاوية Azure Cosmos له خاصية تعريف _etag النظام. يتم إنشاء قيمة من تلقائيًا _etag، وتحديثها من خلال الخادم في كل مرة يتم فيها تحديث العنصر. _etag يمكن استخدامها مع رأس طلب الموفرة العميل if-match؛ للسماح للخادم بتحديد ما إذا كان يمكن تحديث عنصر بشكل مشروط. قيمة العنوان if-match يطابق قيمة في _etag الخادم، ثم يتم تحديث العنصر. إذا لم يعد قيمة عنوان طلبif-matchحاليًا، يرفض الخادم العملية باستخدام رسالة استجابة "HTTP 412 Precondition failure". ثم يمكن للعميل إعادة جلب العنصر؛ للحصول على الإصدار الحالي من العنصر على الخادم، أو تجاوز إصدار العنصر في الخادم بقيمته الخاصة _etag للعنصر. بالإضافة إلى ذلك، يمكن استخدام _etag مع عنوان if-none-match لتحديد ما إذا كان هناك حاجة إلى إعادة متابعة مورد.
تتغير قيمة العنصر _etag في كل مرة يتم فيها تحديث العنصر. لعمليات استبدال الصنف، يجب التعبير عن if-match صراحة كجزء من خيارات الطلب. على سبيل المثال، راجع نموذج التعليمات البرمجية في GitHub. _etag يتم التحقق ضمنيًا من القيم لكل العناصر المكتوبة التي تم التعامل معها من خلال الإجراء المخزن. إذا تم الكشف عن أي تعارض الإجراء المخزن، فسيتم التراجع عن المعاملة، ثم طرح استثناء. باستخدام هذا الأسلوب، يتم تطبيق إمّا كل الكتابات، أو لا أحد منها ضمن الإجراء المخزن تلقائيًا. هذه إشارة إلى التطبيق لإعادة تطبيق التحديثات، وإعادة محاولة طلب العميل الأصلي.
الخطوات التالية
تعلم المزيد عن معاملات قواعد البينات والتحكم المتفائل في المقالات التالية: