Postgres / Typeorm / Express:如何为来自多个客户端的同时请求保持数据库一致?
Postgres / Typeorm / Express: how to keep database consistent for simultaneous requests from multiple clients?
我正在使用 Express / Typescript / Typeorm / Postgres 为我的应用构建后端。
假设我有一个名为 Restaurant
的 table,其中包含以下列:
restaurant_id
order (Integer)
quota (Integer)
这个想法是每家餐厅对其可以接收的订单数量都有上限。多个客户可以向一家餐厅发送订单,从而使 order
递增 1。
如果餐厅目前:
id: 1
order : 9
quota : 10
同时有两个客户端向其发送订单,出现问题
我希望它的行为使得无论哪个请求先到达,成功地将 order
值增加一,结果:
id: 1
order : 10
quota : 10
请求迟到的客户端将无法增加该值,并会在响应中返回错误,指出配额已用完。
一些想法:
在Typeorm / Postgres中,有没有办法为整数值的列设置上限?这样如果该值设置为某个超过上限的值,它会抛出错误?
我正在考虑限制执行增量的端点一次只能调用一次。鉴于上面的第 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
一次只允许一个调用吗?
首先,阅读文档的相关部分: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)
我正在使用 Express / Typescript / Typeorm / Postgres 为我的应用构建后端。
假设我有一个名为 Restaurant
的 table,其中包含以下列:
restaurant_id
order (Integer)
quota (Integer)
这个想法是每家餐厅对其可以接收的订单数量都有上限。多个客户可以向一家餐厅发送订单,从而使 order
递增 1。
如果餐厅目前:
id: 1
order : 9
quota : 10
同时有两个客户端向其发送订单,出现问题
我希望它的行为使得无论哪个请求先到达,成功地将 order
值增加一,结果:
id: 1
order : 10
quota : 10
请求迟到的客户端将无法增加该值,并会在响应中返回错误,指出配额已用完。
一些想法:
在Typeorm / Postgres中,有没有办法为整数值的列设置上限?这样如果该值设置为某个超过上限的值,它会抛出错误?
我正在考虑限制执行增量的端点一次只能调用一次。鉴于上面的第 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
一次只允许一个调用吗?
首先,阅读文档的相关部分: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)