关于 nodejs sequelize 事务批量拆分

寻技术 JS脚本 / Node.Js 2023年10月14日 94

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()...])就行了

关闭

用微信“扫一扫”