我们正在开发一款让人们借钱的应用程序。我有一个node.js + mongodb逻辑,我真的不知道如何处理它。同步node.js瀑布控制流程
数据模型就像下面的用户列表,谁愿意借钱给别人(假设只有3个贷款人):
[
{
_id:"100",
amount:10.00
},
{
_id:"101",
amount:10.00
},
{
_id:"102",
amount:20.00
}
]
有一个用户要借用,说$ 20.00命中提交。后端的node.js将查询执行mongodb的以下逻辑:通过限制20个记录
1.查询的mongodb 代码:
db.collection('post').find(
{
borrowed_date:{$exists:false}
}).toArray(function(err, result) {
});
2.环路直通的结果加起来的量,直到总匹配借款人的金额。 3.对于那些匹配的记录更新mongodb的最后造成数据库会像下面(借$ 20):
[ { _id: “100”, 量:10.00, borrowed_date:ISODate( “2016-02-16T06:43:29.869Z”) },
{ _id: “101”, 量:10.00, borrowed_date:ISODate( “2016-02-16T06:43:29.869Z” ) },
{ _id: “102”, 量:10.00 } ]
代码:
db.collection('post').update(
{
_id:100,
borrowed_date:{$exists:false}
},
{$set:{borrowed_date:new Date()}},
{w:1},
function(err, result) {
});
上述步骤我使用async.waterfall来控制。会有没有问题,如果击中借按钮每个借款之间的时间如10秒内:
- borrower1借在2016-02-16T06:00:00
- borrower2在2016-02-16T06借:00:10
- borrower2在2016-02-16T06借:00:20
如果在给定时间2个借款人借在同一第二,这将是一个问题。假设借款人1将借入20美元,借款人1将借入10美元。 因此,在第1步,两个borrower1将获得2个记录,ID为100和101. borrower2将获得1个记录,ID为100(他应该获得ID 102)。
async.waterfall是异步的,不会等到所有功能完成,然后第二个请求才会进入瀑布循环。
任何想法如何处理这种情况?
您需要打破你的问题分解成财产以后要小得多。你正在问某人解决你的并发问题,这很困难。正如你所说,你“真的不知道如何处理它” - 或许先去做一些进一步的阅读。 – duncanhall
也许一个db事务可以帮助这个吗?这与你使用回调或w/e真的没有真正的关系。 – Goblinlord
你能概述为什么推荐的方法https://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/在你的情况下不起作用吗? –