我正在使用MongoDB和NodeJS。所以我使用貓鼬。如何用mongoDB/mongoose並行執行讀取/寫入文檔
我正在開發一款多人實時遊戲。所以我在同一時間收到許多玩家的許多請求。
我可以說,我有一所房子集合簡化它,看起來像這樣:
{
"_id" : 1,
"items": [item1, item2, item3]
}
我有一個靜態函數,每個接收請求後調用:
house.statics.addItem = function(id, item, callback){
var HouseModel = this;
HouseModel.findById(id, function(err, house){
if (err) throw err;
//make some calculations such as:
if (house.items.length < 4){
HouseModel.findByIdAndUpdate(id, {$push: {items: item}}, cb);
}
});
}
在這個例子,我編碼,以便house
文件不能有超過4個項目。但是會發生的是,當我同時收到幾個請求時,這個函數會被兩個請求執行兩次,並且由於它是異步的,它們都會將新項目推送到項目字段,然後我的房子有5個項目。
我做錯了什麼?我怎樣才能避免將來的這種行爲?
更新本身可能是原子性的,但調用它和在它之前的測試不是。在find和它的回調之間以及find-and-update和它的回調之間,可以運行任意數量的其他調用並查看過時的未更新數據。請參閱下面的答案。 – Andras 2015-02-07 20:57:48