我交易有问题。
这是我的情况:
因此,在第一个服务中,我先创建一个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);
});
});
在角度上,我将服务称为“更新并插入”(上面),完成后,我将调用另一个服务来查询要更新和插入的表。
存在问题。我注意到在查询第二个服务后,提交已完成,第一个服务返回它已完成,但没有完成。
例如,我有下一组数据:
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);
});
});
答案 0 :(得分:0)
@florin sequelize slack回答了我,所以我把他的回答放在这里:
http://docs.sequelizejs.com/manual/tutorial/transactions.html
- 仅在您返回的承诺链完成后,事务才会提交。这意味着您应该将
.then
行移至 最后,因为sequelize.transaction
还返回了一个promise和 那是交易完成的时候- 您可能想调用
t.rollback()
而不是不带括号将其称为t.rollback
因此,答案是我必须将结果放入事务.then
中,
models.sequelize.transaction(t => {
return models.table_name.update({ ... },{ where:{ ... },transaction: t })
.then(()=>{
return models.sequelize.query(" ... ",{ transaction:t })
.catch(err=>{
t.rollback();
res.status(500).send(err);
});
}).catch(err=>{
t.rollback();
res.status(500).send(err);
});
}).then(result=>{ // <-- Here goes the result
res.status(200).send(result);
})