【问题标题】:Postgres / Typeorm / Express: how to keep database consistent for simultaneous requests from multiple clients?Postgres / Typeorm / Express:如何为来自多个客户端的同时请求保持数据库一致?
【发布时间】:2021-09-29 02:25:28
【问题描述】:

我正在使用 Express / Typescript / Typeorm / Postgres 为我的应用构建后端。

假设我有一个名为Restaurant 的表格,其中包含以下列:

restaurant_id

order (Integer)

quota (Integer)

这个想法是,每家餐厅对其可以接收的订单数量都有一个上限。多个客户可以向餐厅发送订单,从而将order 加一。

如果餐厅目前是:

id: 1
order : 9
quota : 10

两个客户端同时给它下单,有问题。

我希望它的行为使得无论哪个请求先到达,成功地将 order 值加一,结果:

id: 1
order : 10
quota : 10

并且请求延迟到达的客户端将无法增加该值,并会在响应中返回错误,指出配额已全部用完。

一些想法:

  1. 在 Typeorm / Postgres 中,有没有办法为整数值列设置上限?这样如果将值设置为超过上限的某个值,它会抛出错误?

  2. 我正在考虑限制执行增量的端点一次只调用一次。鉴于上述第 1 点可行,我仍然想在其他一些情况下禁用端点的并行执行。

(这不是运行代码,只是一些参考):

app.put('/restaurant_order/:restaurantId', async (req, res) => {
  const instance = await Restaurant.findOne(restaurantId);
  if (instance.order < instance.quota){
    await getConnection()
      .createQueryBuilder()
      .update(Restaurant)
      .set({ order: () => `order + 1` })
      .where("id = :id", { id: restaurantId })
      .execute();
  }
  
  res.respond({
      ... 
  })
  
});

那么问题就变成了:

如何在 Express 中设置此限制? 我可以将 Express 配置为 app.put('/restaurant_order/:restaurantId', ...) 禁止并行调用,并且每个 restaurantId 一次只允许一个调用吗?

【问题讨论】:

    标签: typescript postgresql express constraints typeorm


    【解决方案1】:

    首先,阅读文档的相关部分:https://www.postgresql.org/docs/8.3/ddl-constraints.html

    例子:

    CREATE TABLE products (
        product_no integer,
        name text,
        price numeric CHECK (price > 0)
    );
    

    在你的情况下,这将是

    order integer CHECK (order < quota)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      相关资源
      最近更新 更多