Mysql nodejs和sql查询-并发访问

Mysql nodejs和sql查询-并发访问,mysql,node.js,asynchronous,concurrency,Mysql,Node.js,Asynchronous,Concurrency,我正在发现nodejs及其异步系统,并使用nodemysql包在MySQL中进行查询。我正在做这样的事情: var stuff = ['a', 'b', 'a']; for(var i=0;i<stuff.length;i++){ connection.query("SELECT COUNT(*) AS count FROM table WHERE column = ?", [stuff[i]], (function(err, rows){ if(rows.

我正在发现nodejs及其异步系统,并使用nodemysql包在MySQL中进行查询。我正在做这样的事情:

var stuff = ['a', 'b', 'a'];
for(var i=0;i<stuff.length;i++){
    connection.query("SELECT COUNT(*) AS count FROM table WHERE column = ?", [stuff[i]],
    (function(err, rows){
        if(rows.count == 0){
            connection.query("INSERT INTO table ...");
        } else {
            connection.query("UPDATE table SET ...");
        }
    }).bind(this)
}
迭代集合 如果项目不在DB中,我插入 如果项目在数据库中,我将更新 因此,我的代码如下所示:

var stuff = ['a', 'b', 'a'];
for(var i=0;i<stuff.length;i++){
    connection.query("SELECT COUNT(*) AS count FROM table WHERE column = ?", [stuff[i]],
    (function(err, rows){
        if(rows.count == 0){
            connection.query("INSERT INTO table ...");
        } else {
            connection.query("UPDATE table SET ...");
        }
    }).bind(this)
}
但我想知道,由于异步模式,这种模式有时是否有问题。这里的行为是什么

选择列='a'=>count==0的位置 选择列='b'=>count==0的位置 选择列='a'=>count==0的位置 插入“a” 插入“b” 插入“a”==>意外行为 或

选择列='a'=>count==0的位置 插入“a” 选择列='b'=>count==0的位置 插入“b” 选择列='a'=>count==1的位置 更新“a”==>预期行为!! 我希望你能理解我的问题,对不起,我的英语不好,这真是个障碍


谢谢。

mysql有一个insert或update命令,如果它不存在,将进行插入,如果它存在,将进行更新

对于具有这种异步行为的insert/update,请查看lib以在系列中运行类似的内容。使用上面的代码示例,您无法确定哪个将首先运行/完成IIRC


这还取决于您要更新的内容。如果你只是想数一些东西,并且需要增加计数,那么顺序并不重要。同样,这一切都取决于您实际想要插入/更新的内容。

我发现递归通常非常适合这种挑战。我一直在使用它——对于这样一个直截了当的问题,它似乎比使用异步更简单

大概是这样的:

var stuff = ['a', 'b', 'a'];

processStuff(stuff);

function processStuff(theStuff) {

    if (theStuff.length) == 0 {
        // Done all items - either return result to client or execute some callback here
        // res.end('Completed');
        return;
    }

    var thisItem = theStuff.shift();

    connection.query('SELECT * FROM table WHERE column = ' + connection.escape(thisItem), function(err, rows) {
        if (rows.length == 0) {
            connection.query("INSERT INTO table ...", function(err, result) {
                processStuff(theStuff);
            });
        } else {
            connection.query("UPDATE table SET ...", function(err, result) {
                processStuff(theStuff);
            });
        }
    });
}

这将使您的查询和更新/插入一个接一个地流动,但它仍然是异步的。我发现这也更容易阅读,也更容易修改。

谢谢,我不知道这个mysql命令。。但事实上,这个问题并不是针对插入或更新问题的。正如您所说,我认为我必须搜索控制流问题。但是没有干净的方法可以做到这一点。。编辑:感谢异步链接