导致交易错误

Анд*_*зюк 4 javascript postgresql node.js express sequelize.js

尝试实现oauth2。卡在顺序交易中。

出现错误:

执行(9edf48f7-5823-4b4f-b444-faa4c1896831):开始交易;

执行(9edf48f7-5823-4b4f-b444-faa4c1896831):COMMIT;

未处理的拒绝错误:此事务已调用提交(9edf48f7-5823-4b4f-b444-faa4c1896831),您将无法再使用它。(拒绝的查询作为此错误的'sql'属性附加)

`

at.save({transaction: t}).then(() => {
                rt.save({transaction: t}).then(() => {
                    t.commit();
                    return done(false, accessToken, refreshToken, {
                        expires_at: expires,
                        scope: scope});
                }).error(function(
                    err) {
                    t.rollback();
                    return done(err);
                });
            }).error(function(err) {
                t.rollback();
                return done(err);
            });
Run Code Online (Sandbox Code Playgroud)

用Postgres序列化4.xx

Dyl*_*den 9

使用自动提交功能处理Sequelize事务时,需要确保从每个查询中返回承诺。看来您没有从嵌套查询中返回承诺,这意味着您的原始承诺会在第一个查询(提交事务)之后解析。为了等待整个提交链完成,您必须返回嵌套的Promise。

return sequelize.transaction(t => {
  return at.save({ transaction: t })
    .then(() => {
      return rt.save({ transaction: t })
        .then(() => {
          return t.commit() // Commit also returns a promise, you will want that to finish too
            .then(() => {
              return done();
            });
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您可以完全忽略该t.commit()调用,因为如果承诺链解决,Sequelize会自动提交事务。如果您不使用回调样式进行事务处理,则应保留该样式。在我的示例中,我使用了回调样式。

祝好运!:)

  • 我的使用的是异步,并且根据 Sequelize github 上的这个问题缺少等待:https://github.com/sequelize/sequelize/issues/7525 (3认同)
  • 对我来说,“forEach()”导致事务自动提交。在 forEach() 内部我有一个 async. 方法。有人可以解释一下吗? (3认同)