Mysql nodejs和sql查询-并发访问
我正在发现nodejs及其异步系统,并使用nodemysql包在MySQL中进行查询。我正在做这样的事情: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.
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命令。。但事实上,这个问题并不是针对插入或更新问题的。正如您所说,我认为我必须搜索控制流问题。但是没有干净的方法可以做到这一点。。编辑:感谢异步链接