MongoDB和写/读一致性

时间:2015-03-30 21:46:47

标签: mongodb nosql

我通过了一个MongoU课程并且中途通过了一秒钟。我已经阅读了我能做什么,做了什么我可以学习,但没有学会如何处理我认为是标准情况。

考虑酒店客房的预订系统。收藏预订:

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

然后当客户检查预订系列{日期:4/1房间:3}时,他们会找到预订,申请可以拒绝预订。

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

接下来会发生什么?其中一个客户预订而另一个客户失败。有点竞争条件?或者一个客户预订,其他人覆盖它。

这可以通过写入问题来预防吗?还是其他一些锁?或者这是更多原子数据库的更好案例?

我看到的所有演示都与博客有关,而博客对独特数据几乎没有什么顾虑。

1 个答案:

答案 0 :(得分:0)

通常,您需要小心数据模型,当然还需要注意应用程序流程。

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

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

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

请注意,如果没有经过适当的权限检查,您的应用程序不应该对此文档进行保护或更新,这不仅适用于MongoDB。在最简单的情况下,对于更新,您需要检查用户尝试更新文档实际上是预订房间的用户。所以我们的模型需要扩展:

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

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

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