使用 async.parallel 续接交易

Sequelize Transaction with async.parallel

我想在 async.parallel() 中使用托管续集交易。

现在,我这样做:

return sequelize.transaction(function (t) {
    return async.parallel([
      function(callback){ return func1(t, callback); },
      function(callback){ return func2(t, callback); }
    ], function(err){

      if(err){
        ...
      }
    });
  }).then(function(){
   ...
  }).catch(function(err){
    ...    
  });

如果 func1func2 先于另一个失败,事务将回滚。然后这两个函数中的下一个将尝试使用事务,但随后出现此错误:

Error: rollback has been called on this transaction(8b7f7cbc-b617-44fb-a9dd-906397e6f7ca), you can no longer use it.

有道理。

将 sequelize 事务和 async.parallel 一起使用的推荐方法是什么?

我只是使用了 非托管事务 而不是托管事务,然后它就起作用了。

return sequelize.transaction().then(function (t) {
    return async.parallel([
      function(callback){ return func1(t, callback); },
      function(callback){ return func2(t, callback); }
    ], function(err){
      if(err){
        return t.rollback();
      }
      
      return t.commit();
    });
  });

请注意,现在我们使用 sequelize.transaction().then(...) 而不是交易中的回调函数。另请注意 t.rollback() return Promise,因此您可以对它们使用 .then()

更多信息:http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-