Добрый день.
У меня есть база данных mongodb, где несколько узлов обрабатывают чтение и запись документов. Нужно сделать так, чтобы только один процесс мог работать с документом одновременно. То есть, мне нужно на какой-то момент блокировать базу, а потом освобождать ее после того, как процесс завершил и обновил записи, То есть, чтоб только один процесс мог обновлять мои записи, а несколько одновременно.
HellishCode, В документе пишут, что любая операция записи 1 документа атомарна. Если вы одним вызовом пишете сразу несколько документов, то атомарными будут операции записи каждого отдельного документа, но не все вместе. И это не зависит от того какую операцию записи вы используете.
В монге нет транзакций.
Но тут требуются пояснения чего же вы хотите.
Вы хотите при чтении заблокировать документ до момента записи?
Кто будет освобождать блокировки, если запись никогда не состоится (клиент упал, связь кончилась, подставь свое)? Такой подход добавляет лишний геморрой. Оно вам точно надо?
res2001, спасибо за ответ. Но как мне быть, если у меня создаются несколько инстансов и все они рвутся в базу. Я хочу заблокировать ее для остальных инстансов, сделать синхронность. Как такое можно достичь?
У меня есть лимит на письма: 1 писем в 1 минуту.
Пользователь отправляет 5 писем одновременно. Локально все работает идеально: уходит одно письмо, через минуту второе и т.д.
Как только я деплою проект, то на сервере уходят все 5 писем одновременно. Я подозреваю, что это связанно с инстансами, что сразу несколько инстансов идут в базу и пока для одного инстанса следующее пиьсмо заблокировано, то другой его в этот момент отправляет.
HellishCode, У вас действительно несколько инстансов?
Ну так может надо какому-нибудь инстансу сказать, что ты будешь отправлять, а остальные пусть не лезут с отправкой.
Речь идет об электронной почте? Сервер на линуксе? Какой MTA используется? Возможно в МТА есть настройки, которыми можно это отрегулировать (отправлять по 1 письму за раз и период отправлений каждые 5 мин).
HellishCode, Ну добавляйте в отдельную коллекцию флаг типа я отправляю с временной меткой и уникальным номером экземпляра. Сделайте индекс по timestamp.
1.Перед добавлением читайте флаги с timestamp позже на 5 мин текущего времени. Если возврат не пустой - отправлять нельзя.
2.Если возврат пустой - добавляйте свой флаг
3.Повторно читайте флаги с timestamp позже на 5 мин текущего времени, если вернулся только ваш 1 флаг, значит можно отправлять. Если флагов больше 1, значит кто-то уже вклинился и отправляет. Этому экземпляру отправлять нельзя.
В коллекцию только добавляете, ничего не удаляете.
Можно глобально удалять по расписанию. Удалять записи позже на 5 мин текущего времени.