सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना
शिक्षार्थी ClientSession खोलेंगे, startTransaction() के भीतर कई ऑपरेशन चलाएँगे और लेन-देन को कमिट या रद्द करेंगे।
सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना, CoddyKit पर MongoDB Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह MongoDB Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
Sessions हैं आधार
MongoDB के बहु-दस्तावेज़ लेन-देन के लिए एक session आवश्यक है। session सर्वर-पक्ष का ऐसा संदर्भ है जो आपके Causal Consistency वाले रीड और लेन-देन की स्थिति को ट्रैक करता है। आप MongoClient से session बनाते हैं, लेन-देन के भीतर प्रत्येक संचालन में उसे पास करते हैं और काम पूरा होने पर session समाप्त करते हैं। session ऑब्जेक्ट पास करना भूल जाने पर संचालन लेन-देन के बाहर चलते हैं और abort होने पर वापस नहीं किए जाते।
startSession() के साथ Session बनाना
client.startSession() को कॉल करके ClientSession ऑब्जेक्ट प्राप्त करें। इससे अभी लेन-देन शुरू नहीं होता—यह केवल सर्वर-पक्ष का संदर्भ स्थापित करता है। Sessions को वैकल्पिक रूप से causalConsistency के लिए कॉन्फ़िगर किया जा सकता है, ताकि session के भीतर किए गए रीड उसी session में पहले किए गए सभी राइट को हमेशा दर्शाएँ, सेकेंडरी पर भी। सर्वर संसाधन मुक्त करने के लिए session को हमेशा finally ब्लॉक में समाप्त करें।
const { MongoClient } = require('mongodb');
const client = new MongoClient(process.env.MONGODB_URI);
async function run() {
const session = client.startSession();
try {
// ... use session here
} finally {
await session.endSession();
await client.close();
}
}लेन-देन शुरू करना
बहु-दस्तावेज़ लेन-देन शुरू करने के लिए वैकल्पिक लेन-देन विकल्पों के साथ session.startTransaction() कॉल करें। सामान्य विकल्पों में readConcern (पूर्ण Isolation के लिए आम तौर पर 'snapshot') और writeConcern (टिकाऊ कमिट के लिए आम तौर पर { w: 'majority' }) शामिल हैं। शुरू होने के बाद, इस session को पास करने वाले सभी संचालन लेन-देन का हिस्सा होते हैं और लेन-देन abort होने पर वापस कर दिए जाते हैं।
session.startTransaction({
readConcern: { level: 'snapshot' },
writeConcern: { w: 'majority' }
});संचालनों में Session पास करना
लेन-देन में शामिल किए जाने वाले प्रत्येक संचालन को विकल्प के रूप में session ऑब्जेक्ट प्राप्त होना चाहिए। यदि आप किसी संचालन में session पास करना भूल जाते हैं, तो वह लेन-देन के बाहर अपने स्वतंत्र राइट के साथ चलता है और abort होने पर वापस नहीं किया जाएगा। लेन-देन कोड में यह बग का एक सामान्य स्रोत है—हमेशा दोबारा जाँचें कि try ब्लॉक के भीतर प्रत्येक insert, update और delete को session प्राप्त हो।
const db = client.db('bank');
const accounts = db.collection('accounts');
// Both operations must receive { session } to be part of the transaction
await accounts.updateOne(
{ _id: fromAccountId },
{ $inc: { balance: -transferAmount } },
{ session } // <-- REQUIRED
);
await accounts.updateOne(
{ _id: toAccountId },
{ $inc: { balance: transferAmount } },
{ session } // <-- REQUIRED
);commitTransaction() के साथ कमिट करना
सभी संचालन सफलतापूर्वक पूरे होने के बाद, डेटाबेस में सभी बदलावों को परमाण्विक रूप से लागू करने के लिए session.commitTransaction() कॉल करें। कमिट कॉल किए जाने तक लेन-देन के कोई भी राइट अन्य संचालन को दिखाई नहीं देते। कमिट होने पर MongoDB सभी राइट लागू करता है और write concern के अनुसार स्वीकृति देता है। सफल कमिट का अर्थ है कि लेन-देन के सभी संचालन स्थायी रूप से सहेज लिए गए हैं।
session.startTransaction();
try {
await accounts.updateOne({ _id: fromId }, { $inc: { balance: -100 } }, { session });
await accounts.updateOne({ _id: toId }, { $inc: { balance: 100 } }, { session });
await session.commitTransaction();
console.log('Transfer committed successfully');
} catch (error) {
await session.abortTransaction();
throw error;
}abortTransaction() के साथ लेन-देन रद्द करना
यदि लेन-देन में कोई संचालन विफल हो जाए या आपका ऐप्लिकेशन लॉजिक तय करे कि लेन-देन आगे नहीं बढ़ना चाहिए, तो session.abortTransaction() कॉल करें। यह लेन-देन में किए गए सभी राइट को इस तरह वापस कर देता है जैसे उनमें से कोई हुआ ही न हो। MongoDB यह गारंटी देता है कि कोई आंशिक स्थिति नहीं बचेगी—अन्य रीडर abort किए गए लेन-देन के किसी भी राइट को कभी नहीं देखेंगे।
session.startTransaction();
try {
const inventory = await db.collection('inventory').findOne({ _id: itemId }, { session });
if (inventory.stock < requestedQty) {
// Business logic: not enough stock — abort
await session.abortTransaction();
return { success: false, reason: 'Insufficient stock' };
}
await db.collection('inventory').updateOne(
{ _id: itemId }, { $inc: { stock: -requestedQty } }, { session }
);
await db.collection('orders').insertOne({ itemId, qty: requestedQty, status: 'confirmed' }, { session });
await session.commitTransaction();
return { success: true };
} catch (error) {
await session.abortTransaction();
throw error;
}withTransaction() सहायक
Node.js ड्राइवर एक सुविधाजनक session.withTransaction(fn) सहायक प्रदान करता है, जो लेन-देन शुरू करने, commit करने और abort करने की प्रक्रिया स्वचालित रूप से संभालता है तथा अस्थायी त्रुटियों के लिए स्वचालित पुनःप्रयास भी करता है। कॉलबैक फ़ंक्शन को session प्राप्त होता है और इसमें आपके लेन-देन से जुड़े सभी संचालन होने चाहिए। मैन्युअल रूप से शुरू करने, commit करने और abort करने की तुलना में withTransaction का उपयोग करने की सलाह दी जाती है, क्योंकि यह MongoDB के लिए आवश्यक पुनःप्रयास तर्क को सही ढंग से संभालता है।
const session = client.startSession();
try {
await session.withTransaction(async () => {
await accounts.updateOne({ _id: fromId }, { $inc: { balance: -100 } }, { session });
await accounts.updateOne({ _id: toId }, { $inc: { balance: 100 } }, { session });
// withTransaction auto-commits on success, auto-aborts on error, and retries transient errors
}, {
readConcern: { level: 'snapshot' },
writeConcern: { w: 'majority' }
});
} finally {
await session.endSession();
}लेन-देन का दायरा और संग्रह
MongoDB का लेन-देन एक ही क्लस्टर के भीतर कई संग्रहों और डेटाबेसों तक फैल सकता है (विभाजित क्लस्टर के लिए MongoDB 4.2+ आवश्यक है)। आप एक संग्रह से पढ़ सकते हैं, दूसरे को अपडेट कर सकते हैं और तीसरे में डेटा insert कर सकते हैं—यह सब एक ही परमाणु लेन-देन के भीतर। एकमात्र प्रतिबंध यह है कि आप कई दस्तावेज़ों वाले लेन-देन के भीतर नए संग्रह या अनुक्रमणिकाएँ नहीं बना सकते; ये DDL संचालन लेन-देन के बाहर होने चाहिए।
await session.withTransaction(async () => {
const db = client.db('ecommerce');
// Span multiple collections in one transaction
await db.collection('inventory').updateOne(
{ productId: 'P1' }, { $inc: { stock: -qty } }, { session }
);
await db.collection('orders').insertOne(
{ productId: 'P1', qty, status: 'new', createdAt: new Date() }, { session }
);
await db.collection('customers').updateOne(
{ _id: customerId }, { $push: { orderHistory: orderId } }, { session }
);
});लेन-देन के लिए प्रतिकृति सेट आवश्यक हैं
कई दस्तावेज़ों वाले लेन-देन के लिए प्रतिकृति सेट या विभाजित क्लस्टर आवश्यक होता है—ये स्वतंत्र MongoDB इंस्टेंस पर काम नहीं करते। स्वतंत्र इंस्टेंस पर लेन-देन API मौजूद होती है, लेकिन startTransaction() को कॉल करने पर एक त्रुटि उत्पन्न होती है। इसका अर्थ है कि यदि आपका एप्लिकेशन कोड लेन-देन का उपयोग करता है, तो आपके स्थानीय विकास परिवेश में स्थानीय प्रतिकृति सेट का उपयोग होना चाहिए (उदाहरण के लिए, mongod --replSet rs0 के माध्यम से या Atlas के निःशुल्क स्तर के माध्यम से)।
// Starting a local replica set for development:
// 1. Start mongod with replica set name
// mongod --replSet rs0 --port 27017 --dbpath /data/db
// 2. In mongosh, initiate the replica set:
// rs.initiate()
// Now transactions will work on localhostलेन-देन की समय-सीमा और सीमाएँ
MongoDB डिफ़ॉल्ट रूप से लेन-देन की अधिकतम अवधि 60 सेकंड निर्धारित करता है (इसे transactionLifetimeLimitSeconds के माध्यम से कॉन्फ़िगर किया जा सकता है)। इससे अधिक समय तक चलने वाले लेन-देन स्वचालित रूप से abort कर दिए जाते हैं। इसके अतिरिक्त, लिखने के संचालनों के लिए लेन-देन को oplog स्थान के 16 MB तक सीमित किया जाता है। लंबे समय तक चलने वाले लेन-देन लॉक भी बनाए रखते हैं और समवर्ती संचालनों के प्रदर्शन को घटा सकते हैं, इसलिए लेन-देन को छोटा और केंद्रित रखें।
सत्यापन सहित पूर्ण धन-हस्तांतरण उदाहरण
अब सभी बातों को एक साथ रखते हैं: withTransaction का उपयोग करने वाला एक पूर्ण, उत्पादन-तैयार बैंक हस्तांतरण फ़ंक्शन। यह लेन-देन के भीतर पर्याप्त शेष राशि का सत्यापन करता है (यह सुनिश्चित करते हुए कि जाँच और debit के बीच कोई अन्य लेखक खाते की राशि समाप्त न कर सके) और audit प्रविष्टि को परमाणु रूप से दर्ज करता है। यह पैटर्न लेन-देन से जुड़ी सभी प्रमुख अवधारणाओं को प्रदर्शित करता है।
async function transferFunds(client, fromId, toId, amount) {
const session = client.startSession();
try {
await session.withTransaction(async () => {
const accounts = client.db('bank').collection('accounts');
const from = await accounts.findOne({ _id: fromId }, { session });
if (!from || from.balance < amount) {
throw new Error('Insufficient funds');
}
await accounts.updateOne({ _id: fromId }, { $inc: { balance: -amount } }, { session });
await accounts.updateOne({ _id: toId }, { $inc: { balance: amount } }, { session });
await client.db('bank').collection('auditLog').insertOne(
{ from: fromId, to: toId, amount, date: new Date(), type: 'transfer' }, { session }
);
});
return { success: true };
} finally {
await session.endSession();
}
}त्वरित जाँच
इस पाठ में MongoDB और NoSQL डेटाबेस की अवधारणाओं के बारे में अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: लेन-देन के लिए client.startSession() से बनाया गया ClientSession आवश्यक होता है, लेन-देन के प्रत्येक संचालन में { session } देना आवश्यक है, तभी वह उसमें शामिल होगा, और withTransaction() अनुशंसित सहायक है, क्योंकि यह पुनःप्रयास तर्क और सफ़ाई की प्रक्रिया स्वचालित रूप से संभालता है। अब हम अस्थायी लेन-देन विफलताओं के लिए त्रुटि-प्रबंधन और पुनःप्रयास तर्क का अध्ययन करेंगे।
एआई शिक्षक के साथ JavaScript सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना” पाठ निःशुल्क है?
हाँ—“सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और MongoDB Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। MongoDB Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना” में मैं क्या सीखूँगा?
शिक्षार्थी ClientSession खोलेंगे, startTransaction() के भीतर कई ऑपरेशन चलाएँगे और लेन-देन को कमिट या रद्द करेंगे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ MongoDB Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या MongoDB Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर MongoDB Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस MongoDB Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर MongoDB Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- वितरित दस्तावेज़ स्टोर में ACID गारंटियाँ
- सेशन और बहु-दस्तावेज़ लेन-देन शुरू करना
- त्रुटि प्रबंधन और पुनःप्रयास तर्क
- लेन-देन के प्रदर्शन संबंधी विचार