【发布时间】:2019-02-17 06:10:52
【问题描述】:
我在 NodeJs 中有一个使用 Express 框架的方法,我在其中 迭代数组并在 Mysql DB 中进行更新,
代码接收一个 Connection 对象和一个 Post Body,
Post Request Body 是一个对象数组,包含要保存在 DB 中的数据,
我正在尝试逐个循环对象并使用更新查询将它们保存在数据库中。
现在奇怪的是,代码只有在立即被调用两次时才有效,
IE。在测试中我发现,我必须发出两次 API 请求才能让代码保存数据。
我在第一次 API 调用时收到以下错误 -
Error Code: 1205. Lock wait timeout exceeded; try restarting transaction
这是一个简单的Update调用,我检查了MySql进程,没有死锁,
SHOW FULL PROCESSLIST;
但相同的代码在第二次 API 调用中起作用。
let updateByDonationId = async (conn, requestBody, callback) => {
let donations = [];
donations = requestBody.donations;
//for(let i in donations){
async.each(donations, function(singleDonation, callback) {
//let params = donations[i];
let params = singleDonation;
let sqlData = []
let columns = "";
if(params.current_location != null){
sqlData.push(params.current_location);
columns += "`current_location` = ?,";
}
if(params.destination_location != null){
sqlData.push(params.destination_location);
columns += "`destination_location` = ?,";
}
if(columns != ''){
columns = columns.substring(0,columns.length-1);
let sqlQuery = 'UPDATE donation_data SET '+columns
+' WHERE donation_id = "' + params.donation_id + '"';
conn.query(sqlQuery, sqlData, function (err, result) {
logger.info(METHOD_TAG, this.sql);
if (err) {
logger.error(METHOD_TAG, err);
return callback(err, false);
}
})
}
else{
return callback(null, false);
}
columns = "";
sqlData = [];
},
function(err, results) {
if (err) {
logger.error(METHOD_TAG, err);
return callback(err, false);
}
else{
return callback(null, true);
}
});
//return callback(null, true);
} // END
还提到以下内容,我猜他也因为奇怪的原因得到了 ER_LOCK_WAIT_TIMEOUT -
NodeJS + mysql: using connection pool leads to deadlock tables
问题似乎与正确指出的 Node 的非阻塞异步性质有关
谁能提供正确的代码?
【问题讨论】: