Multi-Document Transactions (Multi-Document Transactions)
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();
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.