sequelize执行事务的时候因为数据量可能会比较大要拆成100条update一组来执行,弄了半天终于可以了,代码片段如下
const updateResult = [];//存放事务执行结果
const updateFailed = [];//存放失败的批次
const batchAmount = 100;//拆分粒度
await sequelize.transaction(transaction => {
return models.User.findAll(
//查询出要更新的数据
)
}).then(async updateArray => {//得到上一个事务返回的要更新的数据
//事务拆分循环
for(let i = 0;i<Math.ceil(updateArray.length / batchAmount);i++){
await sequelize.transaction(transaction => {
let updateUserPromises = []
for (var j = i * batchAmount; j < (i + 1) * batchAmount && j < updateArray.length; j++) {
updateUserPromises.push(
models.User.update({
score: sequelize.literal('score + ' + updateArray[j].score)
},
{
where: {
id: updateArray[j].userId
},
transaction
}
)
)
}
return Promise.all(updateUserPromises)
}).then(function (result) {
updateResult[i] = true
}).catch(function (err) {
console.log(err)
updateResult[i] = false
})
}
//获取批量处理失败的index
updateResult.forEach((item,index)=> {
if(!item){
updateFailed.push(index)
}
});
//检查是否执行成功
if(updateResult.length === Math.ceil(updateArray.length / batchAmount) && updateResult.indexOf(false) === -1){
'success'
}else{
'failed'
}
})
这里脱裤子放屁了,实际上Promise.all()返回的还是Promise,既然是Promise就可以继续放到Promise.all()里最后判断最终的Promise.all([Promise.all(),Promise.all()...])就行了
以上就是关于 nodejs sequelize 事务批量拆分的详细内容,更多关于关于 nodejs sequelize 事务批量拆分的资料请关注九品源码其它相关文章!