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()...])就行了
版权声明:除特别声明外,本站所有文章皆是本站原创,转载请以超链接形式注明出处!