MongoDB 4.0 में ट्रांजैक्शन सपोर्ट और findOneAndUpdate() का उपयोग
MongoDB 4.0 से पहले मल्टी-डॉक्यूमेंट ACID ट्रांजैक्शन सपोर्ट नहीं करता था। लॉक-जैसे व्यवहार के लिए findOneAndUpdate() का उपयोग करके एटॉमिक रीड-एंड-अपडेट ऑपरेशन किया जा सकता है।
उदाहरण: संग्रह और दस्तावेज़ बनाना
> db.demo404.insertOne({"FirstName":"John"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e6f8c38fac4d418a0178592") }
> db.demo404.insertOne({"FirstName":"Robert"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e6f8c3cfac4d418a0178593") }
> db.demo404.insertOne({"FirstName":"Mike"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e6f8c40fac4d418a0178594") }
सभी दस्तावेज़ देखना
> db.demo404.find();
आउटपुट:
{ "_id" : ObjectId("5e6f8c38fac4d418a0178592"), "FirstName" : "John" }
{ "_id" : ObjectId("5e6f8c3cfac4d418a0178593"), "FirstName" : "Robert" }
{ "_id" : ObjectId("5e6f8c40fac4d418a0178594"), "FirstName" : "Mike" }
findOneAndUpdate() के साथ लॉक-जैसा व्यवहार
> result=db.demo404.findOneAndUpdate(
{"in_transaction": {"$exists": false}},
{"$set": {"in_transaction": true}}
);
आउटपुट:
{ "_id" : ObjectId("5e6f8c38fac4d418a0178592"), "FirstName" : "John" }
व्याख्या:
{"in_transaction": {"$exists": false}}- ऐसा दस्तावेज़ खोजें जिसमें in_transaction फील्ड न हो{$set: {"in_transaction": true}}- उस फील्ड को true सेट करें (लॉक प्राप्त करना)- ऑपरेशन एटॉमिक है - कोई अन्य ऑपरेशन बीच में हस्तक्षेप नहीं कर सकता
- मूल दस्तावेज़ लौटाता है (अपडेट से पहले)
महत्वपूर्ण नोट:
- यह सिंगल-डॉक्यूमेंट एटॉमिसिटी है, मल्टी-डॉक्यूमेंट ट्रांजैक्शन नहीं
- MongoDB 4.0+ में मल्टी-डॉक्यूमेंट ट्रांजैक्शन सपोर्ट करता है (रिप्लिका सेट के लिए)
- MongoDB 4.2+ में शार्डेड क्लस्टर पर भी ट्रांजैक्शन सपोर्ट
आधुनिक ट्रांजैक्शन सिंटैक्स (MongoDB 4.0+):
const session = db.getMongo().startSession();
session.startTransaction();
try {
db.collection1.insertOne({...}, {session});
db.collection2.updateOne({...}, {session});
session.commitTransaction();
} catch (e) {
session.abortTransaction();
} finally {
session.endSession();
}