【发布时间】:2019-04-23 06:45:34
【问题描述】:
我的交易有问题。
这是我的情况:
- 我使用 node.js 作为我的后端和 sequelize.js
- 我使用 Angular 作为我的前端
- 我使用 PostgreSQL 作为我的数据库
- 我必须运行更新,然后插入(在一个服务中),最后查询结果(在另一个服务中)。
所以,在第一个服务中,我创建一个UPDATE,然后创建一个INSERT,如果过程中出现错误,我使用事务回滚。我的代码是这样的:
models.sequelize.transaction(t => {
return models.table_name.update({ ... },{ where:{ ... },transaction: t })
.then(()=>{
return models.sequelize.query(" ... ",{ transaction:t })
.then(result=>{
res.status(200).send(result);
// Everything OK and finished?
}).catch(err=>{
t.rollback;
res.status(500).send(err);
});
}).catch(err=>{
t.rollback;
res.status(500).send(err);
});
});
在 Angular 中,我调用“更新和插入”服务(上图),完成后我调用另一个服务来查询我正在更新和插入的表。
有问题。我注意到在我查询第二个服务后提交完成,第一个服务返回它已经完成但它没有。
比如我有下一组数据:
A true
B true
C true
我运行“更新和插入”(从角度)得到:
A false
B false
C false
D false
当我得到该服务的结果时,我立即运行(从角度)另一个查询该表的服务。但是我没有得到错误的行,而是得到了真正的行并且没有插入:
A true
B true
C true
好像什么都不会发生。
有趣的是,如果我从代码中删除了事务,并且只进行更新和插入而不使用开始和提交(在后续中),它就可以工作。我得到了更新的行:
A false
B false
C false
D false
出于显而易见的原因,这种情况发生得非常快。使用事务,如果我设置一个中断点并让“更新和插入”完成,查询服务会告诉我我需要什么。如果我删除事务,我会得到我想要的结果,但如果发生任何事情,我会错过回滚......
关于发生了什么以及如何解决它的任何线索?
注意:我尝试添加 t.commit 但结果相同。
models.sequelize.transaction(t => {
return models.table_name.update({ ... },{ where:{ ... },transaction: t })
.then(()=>{
return models.sequelize.query(" ... ",{ transaction:t })
.then(result=>{
t.commit;// <--- COMMIT
res.status(200).send(result);
// Everything OK and finished?
}).catch(err=>{
t.rollback;
res.status(500).send(err);
});
}).catch(err=>{
t.rollback;
res.status(500).send(err);
});
});
【问题讨论】:
标签: node.js postgresql sequelize.js