【问题标题】:How to lock table with pg-promise如何使用 pg-promise 锁定表
【发布时间】:2017-12-27 02:14:54
【问题描述】:

我有

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 锁定类别表?

【问题讨论】:

  • 您说删除是从一个 API 调用中调用的,然后在随后的 API 调用中选择,您将获得已删除类别的类别列表。那有什么问题呢?
  • 我想要一个没有删除类别的新列表。
  • 但是你在调用select之前已经调用了delete,它不应该给出删除记录的列表吗?
  • 我认为你误读了英语。例如。有 5 条记录,我在其中一条上调用 delete,然后检索并获取所有 5 条记录,但我只想获取 4 条。
  • 您还可以尝试使这些 API 调用同步,以便仅在第一个完成时调用第二个。看起来它们正在被异步调用,并且即使第一个 API 尚未完成,也会调用第二个 API。

标签: node.js postgresql pg-promise


【解决方案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 的作者,我什至不会涉足该解决方案,因为无论如何它都超出了我的图书馆。

【讨论】:

  • 感谢您的回答。可能我需要重新考虑架构和重定向,只有我从删除中得到响应。
  • @user2846569 如果它确实回答了您的问题,那么请接受答案 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2020-10-21
  • 2022-12-11
  • 2019-11-12
  • 2017-01-27
  • 2018-01-07
相关资源
最近更新 更多