MongoDB Параллельное Обновление Поведения - PullRequest
0 голосов
/ 22 июня 2019

Представьте себе документ, содержащий одно поле: {availableSpots: 100}

, и миллионы пользователей стремятся получить место, отправив запрос на сервер API.

каждый раз, когда приходит запрос, сервер читает документ и, если availableSpot> 0, он уменьшает его на 1 и создает резервирование в другой коллекции.

Теперь я прочитал, что mongodb блокирует документ при каждом обновленииоперация выполнена.

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

1 Ответ

0 голосов
/ 22 июня 2019

MongoDB использует Wired Tiger в качестве механизма запуска по умолчанию, начиная с версии 3.2.

Wired Tiger обеспечивает параллелизм на уровне документа :

Из документов:

WiredTiger использует управление параллелизмом на уровне документа для операций записи.В результате несколько клиентов могут изменять разные документы коллекции одновременно.

Для большинства операций чтения и записи WiredTiger использует оптимистичный контроль параллелизма.WiredTiger использует только намеренные блокировки на глобальном уровне, уровне базы данных и уровне сбора.Когда механизм хранения обнаруживает конфликты между двумя операциями, возникает конфликт записи, в результате которого MongoDB прозрачно повторяет эту операцию.

Когда несколько клиентов пытаются обновить значение в документе, только этот документ будетбыть заблокирован, но не все коллекции.

...