如何防止重新进入节点

时间:2014-12-26 01:03:14

标签: node.js

如何防止重新进入手术?例如:

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?

1 个答案:

答案 0 :(得分:1)

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

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

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