如何使用pg-promise锁定表

时间:2017-12-26 14:51:52

标签: node.js postgresql pg-promise

我有

db.result('DELETE FROM categories WHERE id = ${id}', category).then(function (data) { ...

db.many('SELECT * FROM categories').then(function (data) { ...

最初从一个API调用中调用delete,然后在以下API调用中选择,但db请求的回调以相反的顺序发生,因此我获得了已删除类别的类别列表。

有没有办法用pg-promise锁定类别表?

1 个答案:

答案 0 :(得分:1)

如果您希望SELECT的结果始终反映上一个DELETE的结果,那么您有两种方法可以考虑......

标准方法是将操作统一为一个,因此您最终会针对同一连接执行所有相关查询:

db.task(function * (t) {
    yield t.none('DELETE FROM categories WHERE id = ${id}', category);
    return yield t.any('SELECT FROM categories');
})
  .then(data => {
      // data = only the categories that weren't deleted
  });

当然,您也可以使用标准的promise语法,甚至是ES7 await/async

第二种方法是在您的服务中组织一个人工锁定,以阻止执行任何相应的SELECT,直到DELETE请求全部完成。

然而,这是一个非常尴尬的解决方案,通常指向架构中的缺陷。此外,作为pg-promise的作者,我甚至不会进入该解决方案,因为它无论如何都会超出我的图书馆。