2015-03-13 4 views
1

Модификатор $inc может использоваться для увеличения поля (например, счетчика для аналитики, просмотра страниц и т. Д.).

Как это работает, если есть параллельные запросы?

Скажем, у меня есть документ:

{ "views" : 1 } 

Что произойдет, если два одновременных запросов с использованием $inc? Будет ли вид 2 или 3?

ответ

0

Это немного широк, но я могу предложить широкие штрихи. Начиная с MongoDB используется collection level locking с механизмом хранения по умолчанию. Существует также механизм хранения WiredTiger, который реализует document level locking. Но в основном во всех выпусках есть некоторый уровень «блокировки», который происходит при каждом запросе. Чем лучше уровень, тем лучше в зависимости от вашей фактической пропускной способности.

По существу, ни одно из двух запросов не происходит одновременно, поскольку они будут «блокировать» блокировку, созданную до ее освобождения. Таким образом, значение, которое будет возвращено (например, запрос findAndModify()), будет иметь значение «текущего состояния», когда этот запрос был выполнен.

Таким образом, при таком запросе оператор, который был выполнен первым, вернет значение 2, а следующий исполняемый оператор вернет значение 3. Конечная позиция в базе данных состоит в том, что в настоящее время значение будет равно 3.

Таким образом, невозможно что-то «изменить» одновременно, а конечным состоянием будет то, что происходит после выдачи «всех» запросов. Таким образом, $inc и другие операторы выполняют точно так, как должны, и изменяют контент на основе состояния документа в тот момент, когда он действительно мог получить к нему доступ.

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