2015-03-30 33 views
0

我已通过MongoU课程和中途通过第二。我已经阅读了我所能做的,并做了我所能学习的东西,但未能学会如何处理我认为的标准情况。MongoDB和写/读一致性

考虑酒店客房的预订系统。这里是一家集的预订:

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

然后当客户端检查预定集合{日期:4/1客房: 3},他们会发现一个预订,并且该应用程序可以拒绝预订。

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

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

这可以防止与写入问题?或者其他一些锁?或者这对于更多的原子数据库来说更好?

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

回答

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而引发异常,则同时进行预约。在进行更新之前,您需要检查reservationFor是否保存当前用户的用户ID。

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

+0

嘿,谢谢你的回答。我想你是对的。 有趣的是,独特的化合物_id的解决方案就在前几天来到我身边,认为这将是一种保证它独特的方法。 感谢您的深思熟虑的答案。保重。 – csduarte 2015-04-07 18:31:36