2015-04-09 2 views
0

У меня есть эти операции:вручную заблокировать для MongoDB

  1. Найти документ из коллекции.
  2. Манипулировать базой doc.prop на текущее значение, которое «prop» является строкой.
  3. Обновить документ обратно в коллекцию.

В этом случае я должен убедиться, что эти операции являются атомарными, поскольку обновление doc.prop должно основываться на текущем значении.

Вот два подхода: 1. Добавьте свойство valueKey (Number) в doc, убедитесь, что значениеKey соответствует при обновлении документа. Увеличьте значениеKey после обновления. Если значениеKey не сопоставлено, отметьте это обновление как сбой и повторите попытку. 2. Используйте «fsyncLock», предоставленный MongoDB для блокировки всего экземпляра mongod во время операций.

1-й подход, о котором я упоминал выше, хорошо, но при столкновении с огромным объемом этих операций одновременно могут возникать «сбой» и «повторная попытка».

2-й подход, который я еще не пробовал, я думаю, что он предназначен для резервного копирования базы данных и не подходит в этом случае.

Так что мне интересно, есть ли другой эффективный подход?

ответ

0

Первый подход называется optimistic lock. Оптимистичные блокировки предполагают, что вероятность столкновения низкая, в противном случае, как вы уже указали, много попыток. Эти повторы также могут быть разрушительными - если текст редактируется, может возникнуть смысл объединить изменения, но вряд ли когда-либо имеет смысл для номера телефона.

Блокировка всей базы данных - это крайняя форма пессимистической (автономной) блокировки, где параллелизм системы намеренно уменьшается. Однако у этого есть проблемы, потому что clients don't know what's going on - их изменения просто проваливаются, что является самым худшим в своем роде пользовательским интерфейсом.

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

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

Мораль: Это не технологическая проблема, это логическая проблема. Документы Google демонстрируют один способ разрешить одновременное редактирование нескольких пользователей, но его трудно реализовать, он ограниченным использованием в других типах приложений и по-прежнему считается раздражающим некоторых пользователей. Git и подобные показывают другой метод, в котором логика ветвей, слияние и конфликты также доступны пользователю, но асинхронно (контроль параллелизма нескольких версий).

Смежные вопросы