flutter - 如何在 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 请求预订门票。当时 "seat_available" 是 "["1", "2", "3", "4", "5"]" 并且他们得到了座位 1。所以操作更新为 "[ "1A" , " 2”、“3”、“4”、“5”]
- 在 User_B 请求预订票后,此时 User_B 获得与 User_A 相同的“seat_available”数据,即“[”1”、“2”、“3”、“4”、“5”]” . 它应该是从 User_A 更新的"[ "1A" , "2", "3", "4", "5"]。
这使得 User_A 和 User_B 获得了相同的预订座位,即“1A”。我怎么解决这个问题?
解决方案
这可以通过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。
推荐阅读
- javascript - 将鼠标悬停在元素上的Javascript函数?
- java - 如何解析具有相同键的动态嵌套 JSON 并存储在 JAVA 类中
- git - 在两个目录之间创建 git diff 并将补丁应用于目录
- protractor - AWS Device Farm:Protractor 脚本在本地机器上运行,而不是在 AWS 云机器上运行
- flutter - 如何防止对象在每次被调用时重新初始化?- 飞镖/颤振
- r - 如何保持每行至少有两个值的数据
- python - 在 repli 中查找海龟屏幕的大小
- ruby-on-rails - 分组后如何在 Rails 中排名
- html - 我试图让我的图像在它们被悬停后改变,但是由于某种原因,当我将鼠标悬停在另一个变化上时
- javascript - 如何使用谷歌地图角度组件从谷歌地图中删除地标