MongoDB 和 Write/Read 一致性

MongoDB and Write/Read Consistency

我已经通过了 MongoU 课程和中途课程。我已经尽我所能阅读并尽我所能学习,但未能学会如何处理我认为的标准情况。

考虑酒店客房预订系统。有collection次预订:

4/1 - 房间 1 4/1 - 房间 2 4/1 - 房间 3

然后当客户检查预订时 collections { date: 4/1 Room: 3},他们会找到一个预订,应用程序可以拒绝预订。

但是,假设两个用户同时查找 {date: 4/1 Room: 4},应用程序将继续为两个客户进行预订,这意味着他们将尝试创建预订。

接下来会发生什么?其中一位客户获得了预订,而另一位失败了。有点竞争条件?还是一位客户获得了预订,而其他人将其覆盖。

这可以通过写入问题来避免吗?还是别的什么锁?或者这是更多原子数据库的更好案例?

我看到的所有演示都与博客有关,很少关注唯一数据。

一般来说,您需要谨慎处理您的数据模型,当然还有您的应用程序流程。

防止重复预订的一种方法是使用复合 _id 字段:

{
  _id: { room: 1, date:"4/1" }
}

因此,一旦 4 月 1 日预订了房间 1,就无法创建房间 1 的重复预订,因为 _id's 保证是唯一的。第二个 insert 将失败。或者,您可以在任意复合字段上创建唯一索引。

请注意,未经适当的权限检查,您的应用程序不应更新或更新此文档,这仅适用于 MongoDB。在最简单的情况下,对于更新,您需要检查尝试更新文档的用户是否真的是预订房间的用户。所以我们的模型需要扩展:

{
  _id:{room:"1",date:"4/1"},
  reservationFor:"userID"
}

所以现在它变得非常简单:在插入预订之前,您检查一个。如果结果不为空,则说明该房间已有预订。如果由于插入时重复 ID 而引发异常,则同时进行了保留。在进行更新之前,您需要检查 reservationFor 是否包含当前用户的用户 ID。

如何应对这种情况在很大程度上取决于用于开发应用程序的语言和框架。我倾向于做的是捕获相应的异常并相应地修改 errorMessage