簡體   English   中英

PostgreSQL的Sequelize.js事務問題

[英]Sequelize.js Transaction problem with postgreSQL

我的交易有問題。

這是我的情況

  • 我將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);
    });
});

來自sequelize slack的@florin回答了我,所以我把他的回答放在這里:

http://docs.sequelizejs.com/manual/tutorial/transactions.html

  1. 僅在您返回的承諾鏈完成后,交易才會提交。 這意味着你應該移動.then在端線,因為sequelize.transaction也返回一個承諾,那就是當交易完成
  2. 您可能要調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM