我有一個併發請求問題,它會修改db。Nodejs中的併發請求處理
我在做什麼。 一個請求獲取用戶1的數據,然後計算用戶1修改的記錄中的字段1的數據,然後保存。
下一次請求獲取用戶1的數據,然後計算user-1修改過的記錄中的field-1的數據,並保存。
這兩個請求都同時運行。所以最後的請求更新錯誤的數據。
function calculate() {
var needUpdate = false;
user = new UserLib(user_id);
var old_config = user.config;
if (old_config[req.id]) {
old_config[req.id].value = 0;
needUpdate = true;
}
if (req.delete == void(0) || req.delete == false) {
delete req.delete;
old_config[req.id].value = old_config[req.id].value + 1;
needUpdate = true;
}
if (needUpdate) {
return user.save();
}
return true;
}
我們正在同時兩個請求。
var express = require('express');
var app = express();
app.get('/update', function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/html'
});
calculate(req);
function calculate(req) {
var needUpdate = false;
user = new UserLib(user_id);
var old_config = user.config;
if (old_config[req.id]) {
old_config[req.id].value = 0;
needUpdate = true;
}
if (req.delete == void(0) || req.delete == false) {
delete req.delete;
old_config[req.id].value = old_config[req.id].value + 1;
needUpdate = true;
}
if (needUpdate) {
user.save();
}
}
res.end('Done');
});
first reuest with following parameter {
user_id: 1,
id: 1,
value: 5,
delete: false
}
Anothere request with follwing parmter {
user_id: 1,
id: 1,
delete: true
}
是您使用的庫來控制流動? Promises或[async](https://github.com/caolan/async)? – soyuka
我們正在使用藍鳥 –
其實這是我認爲無法通過promisification處理的事情。如果你有任何解決方案,這將是欣賞。 –