![](/img/trans.png)
[英]Querying JSONB field on a associated model with Sequelize.js and PostgreSQL
[英]Sequelize.js Transaction problem with 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);
});
});
來自sequelize slack的@florin回答了我,所以我把他的回答放在這里:
http://docs.sequelizejs.com/manual/tutorial/transactions.html
- 僅在您返回的承諾鏈完成后,交易才會提交。 這意味着你應該移動
.then
在端線,因為sequelize.transaction
也返回一個承諾,那就是當交易完成- 您可能要調用
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);
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.