gpt4 book ai didi

javascript - 无法回滚 Sequelize 事务

转载 作者:搜寻专家 更新时间:2023-10-31 23:01:25 27 4
gpt4 key购买 nike

我正在尝试实现 OAuth2,但我受困于 Sequelize 事务。

获取错误:

Executing (9edf48f7-5823-4b4f-b444-faa4c1896831): START TRANSACTION;
Executing (9edf48f7-5823-4b4f-b444-faa4c1896831): COMMIT;
Unhandled rejection Error: commit has been called on this
transaction(9edf48f7-5823-4b4f-b444-faa4c1896831), you can no longer
use it. (The rejected query is attached as the 'sql' property of
this error)

以下是相关的JavaScript代码:

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 的 Sequelize 4.x.x

最佳答案

当您使用自动提交功能处理 Sequelize 事务时,您需要确保从每个查询中返回 promise 。看起来您没有从嵌套查询中返回 promise ,这意味着您的原始 promise 在第一个提交事务的查询之后得到解决。为了等待整个提交链完成,您必须返回嵌套的 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() 调用,因为如果 promise 链解析,Sequelize 会自动提交事务。如果您不使用回调样式进行交易,那么您应该将其保留在那里。在我的示例中,我使用了回调样式。

祝你好运! :)

关于javascript - 无法回滚 Sequelize 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45690000/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com