2014-12-26 72 views
0

如何防止重新进入操作?例如:如何防止重新进入节点

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或其他随机值。因为在调用第一个saveValToDB()之前,​​可能已经执行了很多次。换句话说,这没有序列化。

有没有一种方法可以确保100次更新后的值为100?

+0

肯定这样的事情不会在Node.js工作; Node是一种非阻塞语言,这意味着它不会等待完成操作;你需要使用async.each或者async.map – user385729

回答

1

您遇到的问题是竞争条件。该值正在同时读取和写入。

您可以按顺序执行所有写操作(请参阅async#eachSeries)。

通常更好的解决方案是在数据库服务器上执行增量。参见mongodb $inc operator和redis INCR operator作为原子增量的示例。