首页 > 解决方案 > 如何在 Hasura graphql 和 Netlify 中处理多个请求?

问题描述

我正在使用 Flutter、Hasura graphql 和 Postgres DB 开发一个预订系统。

假设我的数据库有两个主表,“Operation”和“Ticket”

"Operation" : "id", "operation_date", "seat_available".

"Ticket" : "id", "seat_no", "operation_id", "user_id".

在“操作”表中,我有一个名为“seat_available”的列,它是一个包含可用座位的字符串数组(例如,[“1”、“2”、“3”、“4”、“5”])

当某个用户预订座位时,它在“tickets”表中创建了一条记录,其中包含“operation_id”,并且尚未分配任何座位号。

我在 Hasura 中创建了一个事件触发器来触发表“Tickets”中的“插入”,并使用 netlify 作为 webhook。netlify 函数用于检查“Operation”表中的“seat_available”以及票证中的特定“operation_id”,并为该预订票分配一个座位号。

问题是当多个用户同时预订座位时。他们得到了相同的“seat_available”数据。这会造成预订冲突。例如:

这使得 User_A 和 User_B 获得了相同的预订座位,即“1A”。我怎么解决这个问题?

标签: fluttergraphqlnetlifyeventtriggerhasura

解决方案


这可以通过where在更新期间在 seat_available 上添加条件来完成。例如,你可以做这样的事情

UPDATE operation SET seat_available = {"1A", "2", "3", "4", "5"} where id = "<operation_id>" and seat_available = {"1", "2", "3", "4", "5"} 
RETURNING * 

如果查询返回一行,则更新发生,您可以继续。否则,您应该重复获取最新的 seat_available 并分配座位的过程。

在您的示例中, User_A 查询将返回一行。User_B 查询将不会返回,因为 User_A 查询已经更新了 seat_available,并且 User_B 在 seat_available 上的 where 条件将为 false。


推荐阅读