Node.js Nodejs-带循环的节点mysql事务

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',

我的nodejs项目当前使用

我有一个多级数据数组,我想插入到多个表中。交易是我为了实现我的目标而想到的。下面是我的代码概要:

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
确实提示!