【问题标题】:Sequelize.js Transaction problem with postgreSQLSequelize.js postgreSQL的事务问题
【发布时间】: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


    【解决方案1】:

    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);
    })
    

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2016-03-29
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多