Node.js Nodejs-带循环的节点mysql事务
我的nodejs项目当前使用 我有一个多级数据数组,我想插入到多个表中。交易是我为了实现我的目标而想到的。下面是我的代码概要:Node.js Nodejs-带循环的节点mysql事务,node.js,transactions,commit,node-mysql,Node.js,Transactions,Commit,Node Mysql,我的nodejs项目当前使用 我有一个多级数据数组,我想插入到多个表中。交易是我为了实现我的目标而想到的。下面是我的代码概要: const mysql = require("mysql") const pool = mysql.createPool({ // connectionLimit=10 by default connectionLimit: 5, // 10 by default host: 'somehost', user: 'userblah',
const mysql = require("mysql")
const pool = mysql.createPool({ // connectionLimit=10 by default
connectionLimit: 5, // 10 by default
host: 'somehost',
user: 'userblah',
password: 'passworblah',
database: 'dbblah'
})
pool.getConnection(function(err, dbConnection) {
dbConnection.beginTransaction(function(err1) {
if (err1) {
console.log(“Unable to begin the transaction”)
return
}
arrayElements.forEach(function(element) {
var insert1 = mysql.format(“INSERT INTO table1(…) VALUES (…)”, […])
dbConnection.query(insert1, function(error1, result1) {
if (error1) {
return dbConnection.rollback(function() {
console.log(“Insert failed”)
})
}
const lastID = result1.insertId
// A: more loops coming here to insert sub-data to more tables with lastID
// B: SHOULD I dbConnection.commit here???
})
})
}
}
我认为现在在
B
提交dbConnection.commit
还为时过早(而forEach
正在进行)?我应该怎么做才能确保一切都完成,然后提交?您忽略了db调用基本上都是IO调用。他们需要时间来处理。因此,当您在forEach中调用insert语句时,所有调用都会被命中,它们不会等待您的查询应答
var async = require('async')
const mysql = require("mysql")
const pool = mysql.createPool({ // connectionLimit=10 by default
connectionLimit: 5, // 10 by default
host: 'somehost',
user: 'userblah',
password: 'passworblah',
database: 'dbblah'
})
pool.getConnection(function(err, dbConnection) {
dbConnection.beginTransaction(function(err1) {
if (err1) {
console.log(“Unable to begin the transaction”)
return
}
Async.eachSeries(arrayElements,function iteratorOverElems(element,callback) {
var insert1 = mysql.format(“INSERT INTO table1(…) VALUES (…)”, […])
dbConnection.query(insert1, function(error1, result1) {
if (error1) {
return callback(err)
})
}
const lastID = result1.insertId
moreInsertion(arguments,
function (err,result){
if(err){
return callback(err)
}
// A: more loops coming here to insert sub-data to more tables with lastID
//now return the iterator
return callback();
})
})
},function finalCb(err){
if(err){
//rollback
}else{
// commmit here when all the insertions have been successful
}
});
}
}
这不是确定的代码。你需要努力。使用异步库管理forEach循环函数中每个元素的异步函数处理
我认为您应该在所有查询都成功后提交,否则将回滚
对于每个元素,async.eachSeries的工作方式类似于调用迭代器。如果使用err参数调用回调,则忽略其余元素,并调用最终回调。有关更多详细信息,请参阅异步文档谢谢,
async
确实提示!