导致回滚无法与promise.all一起使用

时间:2019-02-06 15:13:56

标签: javascript node.js sequelize.js

当我将Promise.all与“循环更新”一起使用时,sequelize事务不会回滚

我将PostgreSQL与sequ​​elize一起使用,如果没有错误,下面的代码可以正常工作。

return db.transaction(t => {
 let promises = [];
 promises.push(
  valuesToUpdate.map(item => {
   return db.models.TableToUpdate.update(
    {
     prop1: item.val1,
     prop2: item.val2,
     prop3: item.val3,
     prop4: item.val4
    }
   );
  })
 );

 return Promise.all(promises)
  .then(res => {
   return h.response().code(201);
    })
      .catch(err => {
        console.log(err);
         });
 });

预期结果:当任何更新的值存在错误时,sequelize应该回滚该事务中的所有内容

实际结果:当任何更新的值中存在错误时,sequelize会提交正确的值,但不会提交有错误的值(例如不违反null等)。我不要这个同样,如果出现错误,则将调用catch块,但续集仍然不会回滚。

1 个答案:

答案 0 :(得分:0)

在交易级别需要抓住一个障碍。这是我使用的结构:

 sequelizeDB.transaction(function (t) {                                  
    ...
    promises.push(newPromise1);
    ...
    promises.push(newPromise2);
    ...
    return Promise.all(promises);
 }).then(function () {
    console.log("SUCCESS!!! (will commit)");
    next(); 
 }).catch(function (err) {
    console.log("FAILURE !!! (will rollback)");
    return next(err);
 });