【发布时间】:2016-05-25 09:39:11
【问题描述】:
我有一个并发请求的问题,它修改了 db。
我在做什么。 一个请求为 user-1 获取数据,然后为 user-1 计算数据,修改记录中的字段 1,并保存。
下一个请求获取 user-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
}
【问题讨论】:
-
您使用什么库来控制流?承诺或async?
-
我们使用的是蓝鸟
-
实际上,我认为这是无法通过承诺来处理的。如果您对此有任何解决方案,将不胜感激。
-
错了,一切都可以通过promisification来处理。你能给我一段代码吗?我现在正在写一个一般性的答案。
-
函数计算(){ var需要更新=假;用户 = 新用户库(user_id); var old_config = user.config; if(old_config[req.id]) { old_config[req.id].value = 0;需要更新=真; } if(req.delete == void(0) || req.delete == false){ 删除 req.delete; old_config[req.id].value = old_config[req.id].value + 1;需要更新=真; } if(needUpdate) { return user.save(); } 返回真; }
标签: node.js concurrency