المعاملات والتحكم المتفائل في التزامن

ينطبق على: NoSQL

توفر معاملات قاعدة البيانات نموذج برمجة آمن، ويمكن التنبؤ به للتعامل مع التغييرات المتزامنة على البيانات. قواعد البيانات العلائقية التقليدية؛ مثل: خادم SQL، تسمح لك لكتابة منطق العمل باستخدام الإجراءات المخزنة و/ أو مشغلات، وإرسالها إلى الخادم للتنفيذ مباشرة داخل مشغل قاعدة البيانات. مع قواعد البيانات العلائقية التقليدية، يطلب منك التعامل مع لغتي برمجة مختلفتين لغة برمجة التطبيقات (غير المعاملات)؛ مثل: JavaScript، Python، C#، Java، إلخ، ولغة برمجة المعاملات (مثل: T-SQL)، التي يتم تنفيذها في الأصل من خلال قاعدة البيانات.

يدعم مشغل قاعدة البيانات في قاعدة بيانات Azure Cosmos معاملات ACID الكاملة (الذرية، والتناسق، والعزلة، والمتانة) المتوافقة مع عزل اللقطة. يتم تنفيذ جميع عمليات قاعدة البيانات ضمن نطاق القسم المنطقي للحاوية بشكل معاملات داخل محرك قاعدة البيانات الذي تستضيفه النسخة المتماثلة للقسم. تتضمن هذه العمليات كل من الكتابة (تحديث عنصر واحد أو أكثر داخل القسم المنطقي)، وعمليات القراءة. يوضح الجدول التالي العمليات، وأنواع المعاملات المختلفة:

العملية نوع العملية معاملة فردية أو متعددة العناصر
إدراج (دون مشغّل ما قبل/ بعد) كتابة عملية عنصر واحد
إدراج (مع مشغّل ما قبل/ بعد) الكتابة والقراءة عملية عناصر متعددة
استبدال (دون مشغّل ما قبل/ بعد) كتابة عملية عنصر واحد
استبدال (مع مشغّل ما قبل/ بعد) الكتابة والقراءة عملية عناصر متعددة
Upsert (دون مشغّل ما قبل/ بعد) كتابة عملية عنصر واحد
Upsert (مع مشغّل ما قبل/ بعد) الكتابة والقراءة عملية عناصر متعددة
حذف (دون مشغّل ما قبل/ بعد) كتابة عملية عنصر واحد
حذف (مع مشغّل ما قبل/ بعد) الكتابة والقراءة عملية عناصر متعددة
تنفيذ الإجراء المخزن الكتابة والقراءة عملية عناصر متعددة
بدأ النظام تنفيذ إجراء دمج كتابة عملية عناصر متعددة
بدأ النظام تنفيذ حذف العناصر استنادًا إلى انتهاء صلاحية (TTL) عنصر كتابة عملية عناصر متعددة
مقروء مقروء عملية عنصر واحد
موجز التغيير قراءة عملية عناصر متعددة
قراءة مُرقمة قراءة عملية عناصر متعددة
استعلام مُرقم قراءة عملية عناصر متعددة
تنفيذ UDF كجزء من الاستعلام المُرقم قراءة عملية عناصر متعددة

عمليات عناصر متعددة

يسمح لك Azure Cosmos DB بكتابة الإجراءات المخزنة والمشغلات المسبقة/اللاحقة والوظائف المعرفة من قبل المستخدم (UDFs) وإجراءات الدمج في JavaScript. تدعم قاعدة البيانات Azure Cosmos تنفيذ JavaScript داخل محرك قاعدة البيانات الخاص به. يمكنك تسجيل الإجراءات المخزنة، والمشغلات السابقة/اللاحقة، والوظائف المعرفة من قبل المستخدم (UDFs) وإجراءات الدمج على حاوية وتنفيذها لاحقا بشكل معاملات داخل محرك قاعدة بيانات Azure Cosmos DB. كتابة منطق التطبيق في JavaScript يسمح التعبير الطبيعي للتحكم في التدفق، وتحديد النطاق المتغير، والتعيين، والتكامل بين الاستثناءات، والتعامل مع البدائيات داخل معاملات قاعدة البيانات مباشرة في لغة JavaScript.

يتم التفاف إجراءات تخزين JavaScript المستندة إلى مشغلات UDFs، وإجراءات دمج ضمن معاملة ACID المحيطة مع عزل لقطة عبر كل العناصر داخل القسم المنطقي. في سياق تنفيذها، إذا طرح برنامج JavaScript استثناء، يتم إحباط المعاملة بأكملها والتراجع. نموذج البرمجة الناتج بسيط؛ ولكنه قوي. يحصل مطوري JavaScript على نموذج برمجة دائم في حين لا يزالوا يستخدمون لغتهم المألوفة والمكتبة البدائية.

القدرة على تنفيذ JavaScript مباشرةً داخل مشغل قاعدة البيانات يوفر الأداء، وتنفيذ المعاملات من عمليات قاعدة البيانات ضد عناصر حاوية. علاوة على ذلك، نظرا لأن محرك قاعدة بيانات Azure Cosmos DB يدعم في الأصل JSON وJavaScript، فلا يوجد عدم تطابق معوق بين أنظمة نوع التطبيق وقاعدة البيانات.

التحكم في التزامن غير المؤمن

يسمح لك تحكم التزامن غير المؤمن بمنع التحديثات، والحذف المفقود. التزامن، يتم عرض عمليات المتعارضة تأمين غير مؤمنة عادية لمشغل قاعدة البيانات التي استضافه القسم المنطقي الذي يملك العنصر. عند محاولة اثنين من العمليات المتزامنة لتحديث أحدث إصدار من عنصر ضمن قسم منطقي، يفوز واحد منهم، ويفشل الآخر. ورغم ذلك، إذا كانت عملية واحدة أو عمليتان تحاولان تحديث العنصر ذاته بشكل متزامن قد قرأت مسبقًا قيمة أقدم للعنصر، فإن قاعدة البيانات لا تعرف ما إذا كانت القيمة التي تمت قراءتها مسبقًا من خلال أي من العمليتين المتعارضتين أو كليهما هي بالفعل أحدث قيمة للعنصر . لحسن الحظ، يمكن اكتشاف هذا الموقف باستخدام التحكم في التزامن المتفائل (OCC) قبل السماح للعمليات بإدخال حد المعاملة داخل محرك قاعدة البيانات. يحمي التحكم المتزامن غير المُؤمن (OCC) بياناتك من الكتابة فوق التغييرات التي تم إجراؤها بواسطة الآخرين بطريق الخطأ. كما أنه يمنع الآخرين من الكتابة فوق التغييرات الخاصة بك عن طريق الخطأ.

تنفيذ التحكم المتفائل في التزامن باستخدام رؤوس ETag و HTTP

يحتوي كل عنصر مخزن في حاوية Azure Cosmos DB على خاصية محددة _etag من قبل النظام. يتم إنشاء قيمة _etag تلقائيا وتحديثها بواسطة الخادم في كل مرة يتم فيها تحديث العنصر. _etag يمكن استخدامها مع عنوان الطلب المقدم if-match من العميل للسماح للخادم بتحديد ما إذا كان يمكن تحديث عنصر بشكل مشروط. تطابق قيمة if-match العنوان قيمة _etag في الخادم، ثم يتم تحديث العنصر. إذا لم تعد قيمة if-match عنوان الطلب حالية، يرفض الخادم العملية برسالة استجابة "فشل الشرط المسبق HTTP 412". يمكن للعميل بعد ذلك إعادة إحضار العنصر للحصول على الإصدار الحالي من العنصر على الخادم أو تجاوز إصدار العنصر في الخادم بقيمته الخاصة _etag للعنصر. بالإضافة إلى ذلك، _etag يمكن استخدامها مع if-none-match العنوان لتحديد ما إذا كانت هناك حاجة إلى إعادة تعبئة مورد.

تتغير قيمة العنصر _etag في كل مرة يتم فيها تحديث العنصر. بالنسبة لعمليات استبدال العنصر، if-match يجب التعبير عنها بشكل صريح كجزء من خيارات الطلب. على سبيل المثال، راجع نموذج التعليمات البرمجية في GitHub. _etag يتم التحقق ضمنيا من القيم لكافة العناصر المكتوبة التي تم لمسها بواسطة الإجراء المخزن. إذا تم الكشف عن أي تعارض الإجراء المخزن، فسيتم التراجع عن المعاملة، ثم طرح استثناء. باستخدام هذا الأسلوب، يتم تطبيق إمّا كل الكتابات، أو لا أحد منها ضمن الإجراء المخزن تلقائيًا. هذه إشارة إلى التطبيق لإعادة تطبيق التحديثات، وإعادة محاولة طلب العميل الأصلي.

التحكم في التزامن المتفائل والتوزيع العمومي

تخضع التحديثات المتزامنة لأي عنصر إلى التحكم المتزامن غير المُؤمن (OCC) من خلال طبقة بروتوكول الاتصال الخاصة بقاعدة بيانات Azure Cosmos. بالنسبة لحسابات Azure Cosmos DB المكونة للكتابات أحادية المنطقة، يضمن Azure Cosmos DB أن الإصدار من جانب العميل للعنصر الذي تقوم بتحديثه (أو حذفه) هو نفس إصدار العنصر في حاوية Azure Cosmos DB. يضمن ذلك أن تكون كتاباتك محمية من الكتابة فوقها بطريق الخطأ من خلال كتابات الآخرين، والعكس بالعكس. في بيئة متعددة المستخدمين، يحميك عنصر التحكم في التزامن المثالي من حذف أو تحديث إصدار خاطئ من عنصر ما عن طريق الخطأ. على هذا النحو، يتم حماية العناصر ضد "التحديث المفقود" سيئ السمعة، أو "حذف المفقود" المشكلات.

في حساب Azure Cosmos DB الذي تم تكوينه مع عمليات الكتابة متعددة المناطق، يمكن الالتزام بالبيانات بشكل مستقل في المناطق الثانوية إذا تطابقت _etag مع البيانات الموجودة في المنطقة المحلية. بمجرد أن يتم الالتزام ببيانات جديدة محليًا في منطقة ثانوية، يتم دمجها بعد ذلك في لوحة الوصل، أو المنطقة الأساسية. إذا دمج نهج حل التعارض البيانات الجديدة في منطقة المركز، نسخ هذه البيانات بشكل عام مع الجديد _etag. إذا رفض نهج حل التعارض البيانات الجديدة، التراجع عن المنطقة الثانوية إلى البيانات الأصلية و _etag.

الخطوات التالية

تعلم المزيد عن معاملات قواعد البينات والتحكم المتفائل في المقالات التالية: