【发布时间】:2021-04-20 11:15:31
【问题描述】:
我目前有一个 bookings 和一个 bookable 集合。 bookings 中的每个文档都包含一个日期范围(check-out 和 check-in)以及对 bookable 文档的引用数组。
对于如何保证同一 bookables 的两个重叠 bookings 不会同时写入,我感到有些困惑。据我了解,我不能通过交易之类的方式technically lock a collection,所以我想知道我的选择是什么(也许重组我存储数据的方式等)。
任何指针或建议将不胜感激。
编辑:
假设用户 A 想要预订与 用户 B 相同的两个项目,并且时间范围相同。他们几乎同时加载预订 UI 并确认他们的选择。
在为每个请求在 bookings 集合中创建新文档之前,应用程序将执行 get 查询以检查是否存在任何重叠,如果不存在则插入新的预订文档。应用程序检查booking 集合中的重叠和创建新文档之间的那部分时间似乎打开了一个不一致的窗口(例如,可能允许创建两个具有重叠时间范围和项目的文档)。
事务是否可以根据集合中符合特定条件的其他文档的存在来帮助防止将新文档写入集合?
【问题讨论】:
-
您的选项位于firebase.google.com/docs/firestore/manage-data/transactions。如果您很难完成这项工作,请分享一个特定的用例,展示您已经在代码中尝试过的内容以及失败的地方。
-
谢谢@FrankvanPuffelen,也许你是对的。我更新了帖子,更详细地解释了我的疑问。
标签: database google-cloud-firestore concurrency locking