Node.js में नेवले के साथ, क्या कोई मुझे बता सकता है कि इस उपरोक्त कोड को नवीनतम लेनदेन सुविधा का उपयोग करके कैसे पुन:कार्यान्वित किया जा सकता है
मोंगोस में मोंगोडीबी बहु-दस्तावेज़ लेनदेन समर्थन का उपयोग करने के लिए आपको v5.2 से अधिक संस्करण की आवश्यकता है। उदाहरण के लिए:
npm install [email protected]
नेवला लेन-देन के तरीके एक सत्र के बजाय एक वादा लौटाते हैं जिसके लिए await
. का उपयोग करने की आवश्यकता होगी . देखें:
- नेवला में लेन-देन
- ब्लॉग:MongoDB 4.0 पर एक Node.JS परिप्रेक्ष्य:लेनदेन
उदाहरण के लिए, उपरोक्त संसाधन और अपने उदाहरण पर उदाहरण को बदलकर, आप कोशिश कर सकते हैं:
const User = mongoose.model('Users', new mongoose.Schema({
userId: String, wallet: Number
}));
const Transaction = mongoose.model('Transactions', new mongoose.Schema({
userId: ObjectId, amount: Number, type: String
}));
await updateWallet(userId, 500);
async function updateWallet(userId, amount) {
const session = await User.startSession();
session.startTransaction();
try {
const opts = { session };
const A = await User.findOneAndUpdate(
{ _id: userId }, { $inc: { wallet: amount } }, opts);
const B = await Transaction(
{ usersId: userId, amount: amount, type: "credit" })
.save(opts);
await session.commitTransaction();
session.endSession();
return true;
} catch (error) {
// If an error occurred, abort the whole transaction and
// undo any changes that might have happened
await session.abortTransaction();
session.endSession();
throw error;
}
}
<ब्लॉकक्वॉट> परमाणु नहीं है, हमेशा उपयोगकर्ता वॉलेट की राशि के साथ अद्यतन होने की संभावना होती है लेकिन लेनदेन संग्रह में संबंधित लेनदेन नहीं बनाया जाता है जिसके परिणामस्वरूप वित्तीय नुकसान होता है
आपको अपने MongoDB डेटा मॉडल को बदलने पर भी विचार करना चाहिए। खासकर अगर दो संग्रह स्वाभाविक रूप से जुड़े हुए हैं। अधिक जानकारी के लिए परमाणु संचालन के लिए मॉडल डेटा भी देखें।
एक उदाहरण मॉडल जिसे आप आजमा सकते हैं वह है इवेंट सोर्सिंग मॉडल। पहले एक ईवेंट के रूप में लेन-देन प्रविष्टि बनाएं, फिर एकत्रीकरण का उपयोग करके उपयोगकर्ता के वॉलेट बैलेंस की पुनर्गणना करें।
उदाहरण के लिए:
{tranId: 1001, fromUser:800, toUser:99, amount:300, time: Date(..)}
{tranId: 1002, fromUser:77, toUser:99, amount:100, time: Date(..)}
फिर आवश्यकताओं (यानी प्रति 6 घंटे) के आधार पर कैश के रूप में प्रति अवधि प्रत्येक उपयोगकर्ता के लिए राशि की गणना करने के लिए एक प्रक्रिया शुरू करें। आप वर्तमान उपयोगकर्ता के वॉलेट बैलेंस को जोड़कर प्रदर्शित कर सकते हैं:
- उपयोगकर्ता के लिए अंतिम संचित राशि
- उपयोगकर्ता के लिए कोई भी लेनदेन अंतिम संचित राशि के बाद से होता है। यानी 0-6 घंटे पहले।