دوره‌ها / MongoDB / Multi-Document Transactions (Multi-Document Transactions)

Multi-Document Transactions (Multi-Document Transactions)

15 دقیقه Article

Multi-Document Transactions: تراکنش‌های چند Document 🔄

Multi-Document Transactions برای انجام چندین عملیات روی چند document به صورت atomic استفاده می‌شوند. این برای عملیات‌های پیچیده که نیاز به consistency دارند ضروری است.

مثال: انتقال پول (Node.js):

const session = client.startSession();

try {{
  session.startTransaction();
  
  // کم کردن از حساب اول
  await accounts.updateOne(
    {{ _id: "account1" }},
    {{ $inc: {{ balance: -100 }} }},
    {{ session }}
  );
  
  // اضافه کردن به حساب دوم
  await accounts.updateOne(
    {{ _id: "account2" }},
    {{ $inc: {{ balance: 100 }} }},
    {{ session }}
  );
  
  // ثبت در transaction log
  await transactions.insertOne(
    {{
      from: "account1",
      to: "account2",
      amount: 100,
      date: new Date()
    }},
    {{ session }}
  );
  
  // Commit - همه عملیات موفق شدند
  await session.commitTransaction();
  console.log("Transaction committed successfully");
  
}} catch (error) {{
  // Rollback - اگر هر خطایی رخ دهد
  await session.abortTransaction();
  console.error("Transaction aborted:", error);
}} finally {{
  session.endSession();
}}

مثال: MongoDB Shell:

// در mongosh (نسخه جدید)
session = db.getMongo().startSession();
session.startTransaction();

try {{
  session.getDatabase("bank").accounts.updateOne(
    {{ _id: "account1" }},
    {{ $inc: {{ balance: -100 }} }},
    {{ session: session }}
  );
  
  session.getDatabase("bank").accounts.updateOne(
    {{ _id: "account2" }},
    {{ $inc: {{ balance: 100 }} }},
    {{ session: session }}
  );
  
  session.commitTransaction();
}} catch (error) {{
  session.abortTransaction();
}} finally {{
  session.endSession();
}}

نکات مهم:

  • همه عملیات باید session را دریافت کنند
  • اگر هر عملیاتی fail شود، همه rollback می‌شوند
  • Transactions فقط در replica sets و sharded clusters کار می‌کنند
  • Transactions می‌توانند timeout شوند (default: 60 seconds)
💡 نکته: Transactions برای عملیات‌های مالی، inventory management و هر جایی که consistency مهم است استفاده می‌شوند. اما باید توجه داشته باشید که performance کمی کاهش می‌یابد.
✅ یاد گرفتید: Multi-Document Transactions برای عملیات‌های پیچیده که نیاز به atomicity و consistency دارند استفاده می‌شوند!

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

تمرین: Multi-Document Transaction Hard
سوال تمرین

🎯 تمرین: استفاده از Transaction

یک transaction بنویسید که user و account رو با هم update کنه.

پاسخ تمرین
JAVASCRIPT
session = db.getMongo().startSession();
session.startTransaction();

try {
    session.getDatabase("mydb").users.insertOne({ name: "Ali" });
    session.getDatabase("mydb").accounts.updateOne(
        { user_id: ObjectId("...") },
        { $inc: { balance: -100 } }
    );
    session.commitTransaction();
} catch (error) {
    session.abortTransaction();
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.