【问题标题】:How to handle multiple Nodejs requests reading, modifying and updating the same document in MongoDB at same time?如何处理多个Nodejs请求同时读取、修改和更新MongoDB中的同一个文档?
【发布时间】:2021-08-17 08:19:47
【问题描述】:

我在使用 MongoDB 和 Nodejs 的地方有以下代码。我从集合中读取数据,对数据执行一些算术运算,然后更新文档。我的问题是,当多个请求同时出现时,会导致一些数据丢失。我怎样才能避免这种情况?

//Read the Document

const commissionRecord = await CommissionTable.getCommissionRecord(

publicKey

);

// Check if A record Exists or Not

if (commissionRecord.responseData.exists === true) {

// Assigning values to variables

commissionLimit =

commissionRecord.responseData.data.commissionLimit;

commission = commissionRecord.responseData.data.commission;

}

// Perform Arithmetic Operations

commissionLimit = parseInt(commissionLimit) + parseInt(amount);

if (commissionLimit >= 20) {

remainder = commissionLimit % 20;

commission =

parseInt(commission) + Math.floor(commissionLimit / 20);

commissionLimit = parseInt(remainder);

}

if (commissionRecord.responseData.exists === true) {

//Update the document

const result = await CommissionTable.updateCommissionNormal(

publicKey,

commission,

commissionLimit

);

if (result.success) {

return result;

}

问题是,当所有请求同时到来时,它们都一起读取数据,并且更新都是基于它们读取的数据进行的。这种情况如何解决?

【问题讨论】:

    标签: node.js mongodb concurrency versioning


    【解决方案1】:

    为了避免竞争条件,您可以使用互斥锁,Nodejs 有一个模块 async-mutex https://www.npmjs.com/package/async-mutex 想法是锁定所有进程不同时运行特定函数,所有进程将异步工作,直到调用此函数,因为此函数将被创建队列

    【讨论】:

    • 例如,你可以把你的同步码放在这个函数中 await mutex.runExclusive(async () => { // ... });
    猜你喜欢
    • 2019-05-01
    • 2021-04-12
    • 2020-06-30
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2018-05-28
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多