dengan luwak di Node.js, adakah yang bisa memberi tahu saya bagaimana kode di atas diimplementasikan kembali menggunakan fitur Transaksi terbaru
Untuk menggunakan dukungan transaksi multi-dokumen MongoDB di luwak, Anda memerlukan versi yang lebih besar dari v5.2. Misalnya:
npm install [email protected]
Metode transaksi luwak mengembalikan janji daripada sesi yang harus menggunakan await
. Lihat:
- Transaksi di Luwak
- Blog:Perspektif Node.JS tentang MongoDB 4.0:Transaksi
Misalnya, mengubah contoh pada sumber daya di atas dan contoh Anda, Anda dapat mencoba:
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;
}
}
tidak atomik selalu ada kemungkinan dompet pengguna diperbarui dengan jumlah tetapi transaksi terkait tidak dibuat dalam pengumpulan transaksi yang mengakibatkan kerugian finansial
Anda juga harus mempertimbangkan untuk mengubah model data MongoDB Anda. Apalagi jika kedua koleksi tersebut terhubung secara alami. Lihat juga Model data untuk Operasi Atom untuk informasi lebih lanjut.
Contoh model yang bisa Anda coba adalah model Event Sourcing. Buat entri transaksi terlebih dahulu sebagai peristiwa, lalu hitung ulang saldo dompet pengguna menggunakan agregasi.
Misalnya:
{tranId: 1001, fromUser:800, toUser:99, amount:300, time: Date(..)}
{tranId: 1002, fromUser:77, toUser:99, amount:100, time: Date(..)}
Kemudian perkenalkan proses untuk menghitung jumlah untuk setiap pengguna per periode sebagai cache tergantung pada persyaratan (yaitu per 6 jam). Anda dapat menampilkan saldo dompet pengguna saat ini dengan menambahkan:
- Jumlah terakhir yang di-cache untuk pengguna
- Setiap transaksi untuk pengguna terjadi sejak jumlah cache terakhir. yaitu 0-6 jam yang lalu.