如何防止重新进入手术?例如:
var updateValue = function(cb) {
readValFromDB(function(err, val) {
if (err) { /* ... */ }
val = val + 1;
saveValToDB(function(err2, val) {
if (err2) { /* ... */ }
cb();
});
});
};
for(var i=0; i<100; i++) {
updateValue(function() {
});
}
如果数据库中的字段中存在值。初始值为0;经过100次更新后,我希望数据库中的值将变为100。
在节点中,经过100次更新后,数据库中的值将为1,2,3或其他随机值。因为,在调用第一个readValFromDB()
之前,saveValToDB()
可能已多次执行。换句话说,没有序列化。
节点中是否有办法确保在100次更新后值可能为100?
答案 0 :(得分:1)
您遇到的问题是竞争条件。正在同时读取和写入该值。
您可以按顺序执行所有写操作(请参阅async#eachSeries)。
通常,更好的解决方案是在数据库服务器上执行增量操作。请参阅mongodb $inc operator和redis INCR operator作为原子增量的示例。