عمليات دفعة المعاملات في Azure Cosmos DB

ينطبق على: NoSQL

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

ما هي المعاملة في Azure Cosmos DB

يمكن تعريف المعاملة في قاعدة البيانات النموذجية على أنها سلسلة من العمليات التي يتم إجراؤها كوحدة عمل منطقية واحدة. توفر كل معاملة ضمانات خاصية ACID (الحالة الذرية، والاتساق، والعزل، والمتانة).

  • تضمنAtomicity أن يتم التعامل مع جميع العمليات التي تتم داخل المعاملة كوحدة واحدة، وإما أنها جميعاً ملتزَم بها أو لا يتم الالتزام بأي منها.
  • الاتساق يتأكد من أن البيانات دائماً في حالة صالحة عبر العمليات.
  • يضمن العزل عدم تداخل معاملتين مع بعضهما - توفر العديد من الأنظمة التجارية مستويات عزل متعددة يمكن استخدامها بناءً على احتياجات التطبيق.
  • تضمن المتانة وجود أي تغيير يتم إجراؤه في قاعدة البيانات دائماً. يدعم Azure Cosmos DB العمليات المتوافقة مع ACID الكامل مع عزل اللقطة للعمليات داخل نفس مفتاح القسم المنطقي.

عمليات دُفعة العمليات والإجراءات المخزنة

يدعم Azure Cosmos DB حالياً الإجراءات المخزنة، والتي توفر أيضاً نطاق المعاملات على العمليات. ومع ذلك، تقدم العمليات الدفعية للعمليات الفوائد التالية:

  • خيار اللغة - يتم دعم دفعة العمليات على SDK واللغة التي تستخدمها بالفعل، بينما يلزم كتابة الإجراءات المخزنة بلغة JavaScript.
  • تعيين إصدار التعليمات البرمجية - يعد تعيين رمز التطبيق وإدخاله على خط أنابيب CI/CD أمراً طبيعياً أكثر من تنظيم تحديث إجراء مخزن والتأكد من حدوث التمرير في الوقت المناسب. كما أنه يجعل التراجع عن التغييرات أسهل.
  • الأداء - تقليل وقت الاستجابة للعمليات المكافئة بنسبة تصل إلى 30٪ مقارنةً بتنفيذ الإجراء المخزن.
  • تسلسل المحتوى - يمكن لكل عملية داخل دُفعة عمليات استخدام خيارات التسلسل المخصصة للبيانات الأساسية.

كيفية إنشاء عملية مجموعة عمليات

عند إنشاء عملية دفعة للعمليات، ابدأ بمثيل حاوية ومثيل CreateTransactionalBatch:

PartitionKey partitionKey = new PartitionKey("road-bikes");

TransactionalBatch batch = container.CreateTransactionalBatch(partitionKey);

بعد ذلك، أضف عمليات متعددة إلى الدُفعة:

Product bike = new (
    id: "68719520766",
    category: "road-bikes",
    name: "Chropen Road Bike"
);

batch.CreateItem<Product>(bike);

Part part = new (
    id: "68719519885",
    category: "road-bikes",
    name: "Tronosuros Tire",
    productId: bike.id
);

batch.CreateItem<Part>(part);

أخيراً، قم باستدعاء ExecuteAsync على الدُفعة:

using TransactionalBatchResponse response = await batch.ExecuteAsync();

بمجرد تلقي الرد، تحقق مما إذا كانت الاستجابة ناجحة. إذا كانت الاستجابة تشير إلى نجاح، فاستخرج النتائج:

if (response.IsSuccessStatusCode)
{
    TransactionalBatchOperationResult<Product> productResponse;
    productResponse = response.GetOperationResultAtIndex<Product>(0);
    Product productResult = productResponse.Resource;

    TransactionalBatchOperationResult<Part> partResponse;
    partResponse = response.GetOperationResultAtIndex<Part>(1);
    Part partResult = partResponse.Resource;
}

هام

إذا كان هناك فشل، فسيكون للتعلمية البرمجية الفاشلة رمز حالة للخطأ المقابل. سيكون لجميع العمليات الأخرى رمز حالة 424 (التبعية الفاشلة). إذا فشلت العملية لأنها تحاول إنشاء عنصر موجود بالفعل، يتم إرجاع رمز حالة 409 (تعارض). يمكّن رمز الحالة الشخص من تحديد سبب فشل المعاملة.