med mongoose i Node.js, kan nogen fortælle mig, hvordan denne ovenstående kode genimplementeres ved hjælp af den seneste transaktionsfunktion
For at bruge MongoDB multi-dokument transaktioner understøttelse i mongoose du har brug for version større end v5.2. For eksempel:
npm install [email protected]
Mongoose-transaktionsmetoder returnerer et løfte i stedet for en session, som ville kræve at bruge await
. Se:
- Transaktioner i Mongoose
- Blog:A Node.JS Perspective on MongoDB 4.0:Transactions
Hvis du for eksempel ændrer eksemplet på ressourcen ovenfor og dit eksempel, kan du prøve:
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;
}
}
er ikke atomær er der altid mulighed for, at brugerens tegnebog opdateres med beløb, men relateret transaktion er ikke oprettet i transaktionsindsamling, hvilket resulterer i økonomisk tab
Du bør også overveje at ændre dine MongoDB-datamodeller. Især hvis de to samlinger er naturligt forbundet. Se også Modeldata for Atomic Operations for mere information.
Et eksempel på en model, du kan prøve, er Event Sourcing-modellen. Opret først en transaktionspost som en hændelse, og genberegn derefter brugerens pungsaldo ved hjælp af aggregering.
For eksempel:
{tranId: 1001, fromUser:800, toUser:99, amount:300, time: Date(..)}
{tranId: 1002, fromUser:77, toUser:99, amount:100, time: Date(..)}
Indfør derefter en proces til at beregne mængden for hver bruger pr. periode som en cache afhængigt af kravene (dvs. pr. 6 timer). Du kan få vist den aktuelle brugers pungsaldo ved at tilføje:
- Det sidste cachelagrede beløb for brugeren
- Alle transaktioner for brugeren er sket siden det sidste cachelagrede beløb. dvs. 0-6 timer siden.