我們正在開發一款讓人們借錢的應用程序。我有一個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/在你的情況下不起作用嗎? –