我已经通过了一个MongoU课程和中途岛一秒。我已经阅读了我所能做的,但却没有学会如何处理我认为是标准的情况。
考虑一下酒店客房的预订系统。有一个收藏预订:
4/1 -1室4/1 -2 4/1 -3室
然后,当客户端检查预订集合{ date: 4/1 Room: 3}时,他们将找到预订,应用程序可以拒绝预订。
但是,假设两个用户同时寻找{ date: 4/1 Room: 4},则应用程序将为两个客户端进行预订,这意味着他们将尝试创建预订。
接下来会发生什么?其中一个客户预订,另一个客户失败。某种程度的种族状况?或者是一个客户得到一个预订,而另一个人覆盖它。
这能用写的问题来防止吗?还是其他的锁?或者这是更多原子数据库的一个更好的例子?
我看到的所有演示都与博客有关,它很少关注独特的数据。
发布于 2015-03-31 07:43:57
一般来说,您需要小心您的数据模型,当然也要小心您的应用程序流。
防止重复预订的一种方法是使用复合_id字段:
{
_id: { room: 1, date:"4/1" }
}因此,一旦1房间预订了4/1,就不可能创建第1房间的重复预订,因为_id's保证是唯一的。第二个insert将失败。或者,您可以在任意复合字段上创建唯一索引。
但是,请注意,如果没有适当的权限检查,应用程序不应该在此文档上进行更新或更新,这并不仅适用于MongoDB。在最简单的情况下,对于更新,您需要检查试图更新文档的用户是否实际上是预订房间的用户。因此,我们的模型需要扩展:
{
_id:{room:"1",date:"4/1"},
reservationFor:"userID"
}因此,现在变得非常容易:在插入预订之前,您需要检查一个。如果结果不是空的,就已经预订了那个房间。如果由于insert上的重复ID而引发异常,则同时进行了保留。在进行更新之前,您需要检查是否有reservationFor保存当前用户的userID。
如何应对这种情况在很大程度上取决于用于开发应用程序的语言和框架。我倾向于捕获相应的异常并相应地修改errorMessage。
https://stackoverflow.com/questions/29356932
复制相似问题