محتويات الدورة

MongoDB / المتوسط: التجميع وعقود التطبيق / الدرس 12

الجلسات ومعاملات الوثائق المتعددة

اختر ذرية الوثيقة أو المعاملة المدعومة وحدد اتساق القراءة والكتابة وإعادة callback وحدود الأثر الخارجي.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • شرح بنيات المعاملة ونطاق الجلسة.
  • تصميم منطق معاملة تجاري قابل للإعادة المحدودة.

استخدم المعاملة لثابت حقيقي عبر الوثائق

قد يجمع التضمين التغيير ذرياً وتحتاج أحداث وثائق عدة. تتوفر المعاملات لمجموعة النسخ منذ4.0 وللمجزأة منذ4.2 لا المنفردة بالطريقة نفسها. لا تجعل النمو غير المحدود رخيصاً ولها قيود إصدار وبنية. حدد الثابت والمشاركين والفشل وأبعد الشبكة عن callback.

مرر الجلسة نفسها لكل عملية مشاركة

يفترض المقطع عينة نسخ مؤقتة مصرحاً لها وعميلاً مداراً ولا ينشئهما. يستخدم جلسة واحدة للكتابتين ويتحقق من المال والوجهة. الخيارات للمعاملة، وقد يعيد المشغل العمل، فلا ترسل بريداً أو تدفع خارجياً داخل callback. لم ينفذ المثال.

javascript مقطع توضيحي لمشغل Node.js؛ المتطلبات مذكورة في الشرح.
const session = client.startSession();
try {
  await session.withTransaction(async () => {
    const accounts = client.db('quay_lab').collection('accounts');
    const debit = await accounts.updateOne(
      { _id: 10, balance: { $gte: 15 } }, { $inc: { balance: -15 } }, { session });
    if (debit.matchedCount !== 1) throw new Error('source precondition failed');
    const credit = await accounts.updateOne(
      { _id: 20 }, { $inc: { balance: 15 } }, { session });
    if (credit.matchedCount !== 1) throw new Error('destination missing');
  }, { readConcern: { level: 'snapshot' }, writeConcern: { w: 'majority' } });
} finally { await session.endSession(); }

مع100 و40 وحفظ ناجح يتوقع85 و55، ويجهض فشل شرط وحدة العمل.

اضبط الاتساق عند حد المعاملة

الجلسة وحدها ليست معاملة أو لقطة لكل عملية. تضبط read concern الرؤية وwrite concern إقرار الحفظ ولا تضبط الأخيرة لكل عملية داخلها. راجع شروط snapshot وmajority معاً. قد لا يرى قارئ خارجي أضعف الحفظ عبر الشظايا لحظة واحدة، فحدد العقد بدلاً من شعار ACID مطلق.

قد تغني الوثيقة الواحدة عن معاملة زائدة

يغير التحديث الكمية والإصدار بمرشح حالة واحد وهو ذري دون معاملة متعددة لمجرد حقلين. يتوقع ستاً وإصدار3 من تسع وإصدار2. تعني المطابقة الصفرية إعادة الشرط. إذا لزم دفتر مستقل محفوظ معها يتغير متطلب المعاملة أو النموذج.

javascript mongosh توضيحية؛ النتائج المتوقعة مستنتجة وليست قياسات.
db.getSiblingDB('quay_lab').inventory.updateOne(
  { _id: 4, quantity: { $gte: 3 }, version: 2 },
  { $inc: { quantity: -3, version: 1 } }
);

ذرية الوثيقة أداة نمذجة ولا تنسق دفتراً مستقلاً تلقائياً.

لا تعوض علامات الإعادة هوية العمل

تختلف TransientTransactionError وUnknownTransactionCommitResult. اتبع API لا كل استثناء أو العبارة الأخيرة. لا يثبت الحفظ المجهول الفشل وقد تنفذ الشيفرة مراراً. احفظ هوية الحدث والنتيجة للرد الضائع، واقصر المعاملة وتجنب التوازي في جلسة إلا حيث يدعم ونظفها دائماً.

الأخطاء الشائعة وإصلاحها

Transaction numbers are only allowed on a replica set member or mongos

لماذا يحدث؟
استهدف المثال بنية منفردة غير مدعومة.
كيف تصلحه؟
استخدم بنية مؤقتة مدعومة مجهزة صراحة.
كيف تتجنب تكراره؟
تحقق من شروط البنية قبل التصميم.

تخرج كتابة من المعاملة المقصودة

لماذا يحدث؟
لم تتلق العملية الجلسة المشاركة.
كيف تصلحه؟
مرر الجلسة نفسها لكل عملية.
كيف تتجنب تكراره؟
راجع الخيارات والفشل لكل عملية.

يرسل callback المعاد أثراً خارجياً مكرراً

لماذا يحدث؟
وُضع أثر غير آمن للإعادة داخل العمل.
كيف تصلحه؟
استخدم outbox وهوية وافصل التسليم.
كيف تتجنب تكراره؟
اختبر التكرار والحفظ المجهول.

اختبر فهمك

1. يخصم التحويل والمستلم غائب. لماذا تفحص نتيجة الإضافة؟

اعرض الحل المشروح

قد لا ترمي المطابقة الصفرية خطأ، فيحفظ الخصم دون الإضافة. اعتبر الغياب فشل شرط وأجهض، وتحقق من الحسابين والمجموع بعينة مدعومة. تنسق المعاملة العمليات المنفذة والمفحوصة فقط.

2. لماذا لا يكفي كائن جلسة دليلاً على ذرية كتابتين معاً؟

اعرض الحل المشروح

يجب بدء معاملة مدعومة وتمرير الجلسة للعمليتين وإكمالها بخيارات مناسبة. قد تخدم الجلسة السببية خارج المعاملات، فافحص API لا وجود المتغير فقط.

أهم ما تعلمته

  • اختر حدود الوثيقة ثم المعاملة للثابت المتبقي.
  • يجب اتفاق الجلسة والاتساق وسلامة الإعادة.

المراجع الرسمية