2015-03-30 3 views
0

Я прошел курс MongoU и Midway через секунду. Я читал все, что мог, и сделал все, что мог, чтобы учиться, но не смог научиться справляться с тем, что я считаю стандартной ситуацией.MongoDB и Write/Read Consistency

Рассмотрите систему бронирования номеров в отеле. Существует а заказы коллекции:

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" 
} 

Так что теперь это становится довольно просто: перед установкой резервирования, вы проверяете на один. Если результат не пуст, в этой комнате уже есть резервирование. Если исключение выбрано из-за дубликата идентификатора при вставке, то за это время была сделана оговорка. Перед выполнением обновления вам необходимо проверить, что у пользователя reservationFor есть идентификатор пользователя текущего пользователя.

Как реагировать на подобную ситуацию в значительной степени зависит от языка и рамок (-ей), используемых для разработки вашего приложения. То, что я имею в виду, заключается в том, чтобы поймать соответствующие исключения и соответственно изменить errorMessage.

+0

Эй, Спасибо за ваш ответ. Я думаю, вы правы. Забавно, что решение уникального соединения _id приходило ко мне на днях, думая, что это будет способ гарантировать, что он уникален. Цените свой задумчивый ответ. Береги себя. – csduarte