续集交易错误
Posted
技术标签:
【中文标题】续集交易错误【英文标题】:Sequelize transaction error 【发布时间】:2018-01-23 04:56:48 【问题描述】:尝试实现 oauth2。卡在续集交易中。
得到错误:
正在执行 (9edf48f7-5823-4b4f-b444-faa4c1896831):开始交易;
正在执行 (9edf48f7-5823-4b4f-b444-faa4c1896831):提交;
未处理的拒绝错误:已为此调用提交 交易(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);
);
用 Postgres 续集 4.x.x
【问题讨论】:
【参考方案1】:当您使用自动提交功能处理 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();
);
);
);
);
在我上面的示例中,您可以完全省略 t.commit()
调用,因为如果承诺链解析,Sequelize 会自动提交事务。如果您没有使用回调样式进行交易,那么您应该将其保留在那里。在我的示例中,我使用了回调样式。
祝你好运! :)
【讨论】:
我正在使用异步,并且根据 Sequelize github 上的这个问题缺少等待:github.com/sequelize/sequelize/issues/7525以上是关于续集交易错误的主要内容,如果未能解决你的问题,请参考以下文章