2016-02-15 50 views
-1

我们正在开发一款让人们借钱的应用程序。我有一个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秒内:

  1. borrower1借在2016-02-16T06:00:00
  2. borrower2在2016-02-16T06借:00:10
  3. 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是异步的,不会等到所有功能完成,然后第二个请求才会进入瀑布循环。

任何想法如何处理这种情况?

+1

您需要打破你的问题分解成财产以后要小得多。你正在问某人解决你的并发问题,这很困难。正如你所说,你“真的不知道如何处理它” - 或许先去做一些进一步的阅读。 – duncanhall

+0

也许一个db事务可以帮助这个吗?这与你使用回调或w/e真的没有真正的关系。 – Goblinlord

+0

你能概述为什么推荐的方法https://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/在你的情况下不起作用吗? –

回答

0

使用setImmediate会做包装所有的逻辑让所有张贴因此它是一次一个

**

使用setImmediate如果要排队的任何I/O 事件背后的功能已经在事件队列中的回调。

**

setImmediate(function searchPost() { 

    // all code here 

});