gpt4 book ai didi

node.js - Nodejs - 带循环的node-mysql事务

转载 作者:太空宇宙 更新时间:2023-11-04 00:40:01 24 4
gpt4 key购买 nike

我的nodejs项目当前使用node-mysql

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

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???
})
})
}
}

我认为在 BdbConnection.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 的工作方式类似于每个 Element 的调用迭代器。如果使用 err 参数调用回调,则忽略其余元素并调用最终回调。有关更多详细信息,请参阅异步文档 https://github.com/caolan/async#each

关于node.js - Nodejs - 带循环的node-mysql事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37246997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com