PostgreSQL的Sequelize.js事务问题

时间:2018-11-20 18:43:24

标签: node.js postgresql sequelize.js

我交易有问题。

这是我的情况

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

在角度上,我将服务称为“更新并插入”(上面),完成后,我将调用另一个服务来查询要更新和插入的表。

存在问题。我注意到在查询第二个服务后,提交已完成,第一个服务返回它已完成,但没有完成。

例如,我有下一组数据:

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

1 个答案:

答案 0 :(得分:0)

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

  

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

     
      
  1. 仅在您返回的承诺链完成后,事务才会提交。这意味着您应该将.then行移至   最后,因为sequelize.transaction还返回了一个promise和   那是交易完成的时候
  2.   
  3. 您可能想调用t.rollback()而不是不带括号将其称为t.rollback
  4.   

因此,答案是我必须将结果放入事务.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);
})