MongoDB和写/读一致性

MongoDB和写/读一致性,mongodb,nosql,Mongodb,Nosql,我通过了一门孟古课程,中途通过了第二门。我已经读了我能做的,做了我能学的东西,但是没有学会如何处理我认为的标准情况。 考虑酒店房间的预订系统。有一个集合预订: 4/1-1号房间 4/1-第2房间 4/1-第3房间 然后,当客户检查预订集合{date:4/1 Room:3}时,他们将发现一个预订,并且应用程序可以拒绝该预订 但是,假设两个用户同时查找{date:4/1 Room:4},应用程序将继续为两个客户预订,这意味着他们将尝试创建预订 接下来会发生什么?其中一个客户获得预订,另一个失败。有点

我通过了一门孟古课程,中途通过了第二门。我已经读了我能做的,做了我能学的东西,但是没有学会如何处理我认为的标准情况。 考虑酒店房间的预订系统。有一个集合预订:

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

然后,当客户检查预订集合{date:4/1 Room:3}时,他们将发现一个预订,并且应用程序可以拒绝该预订

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

接下来会发生什么?其中一个客户获得预订,另一个失败。有点种族歧视?或者一个客户得到了预订,而另一个人覆盖了它

这可以通过写问题来防止吗?还是别的锁?或者,这是一个更好的情况下,更多的原子数据库


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

一般来说,您需要小心使用数据模型,当然还有应用程序流

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

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

但请注意,未经适当的权限检查,应用程序不应在此文档上升级或更新,因为权限检查仅适用于MongoDB。在最简单的情况下,对于更新,您需要检查试图更新文档的用户是否实际上是预订房间的用户。因此,我们的模型需要扩展:

{
  _id:{room:"1",date:"4/1"},
  reservationFor:"userID"
}
所以现在它变得非常简单:在插入预订之前,您需要检查一个。如果结果不是空的,则该房间已经有预订。如果由于insert上的ID重复而引发异常,则同时进行了保留。在执行更新之前,您需要检查reservationFor是否保存当前用户的用户ID


如何应对这种情况在很大程度上取决于用于开发应用程序的语言和框架。我倾向于捕捉相应的异常,并相应地修改错误消息。

嘿,谢谢你的回答。我认为你是对的。有趣的是,前几天,我想到了独特化合物的解决方案,认为这是一种保证其独特性的方法。感谢你周到的回答。当心。
{
  _id:{room:"1",date:"4/1"},
  reservationFor:"userID"
}