Как MongoDB справляется с одновременными обновлениями?

Я начал использовать MongoDB на работе, пока все хорошо. Мне было интересно, как MongoDB справляется с одновременными обновлениями? Я читал, что в MongoDB нет функции блокировки, поэтому мне было интересно, как с этим справиться.

Спасибо.


person lollancf37    schedule 09.08.2011    source источник
comment
stackoverflow.com/a/50262110/431012 объясняет подход параллелизма wiredTiger (текущий).   -  person Asya Kamsky    schedule 10.05.2018


Ответы (2)


MongoDB использовала блокировку записи на уровне процесса, чтобы гарантировать, что только одна операция записи (обновление/вставка/удаление) может выполняться одновременно. Таким образом, он автоматически решает проблемы параллелизма, поскольку параллелизм записи просто не разрешен.

Если 4 потока попытаются выполнить операцию обновления, один из них возьмет блокировку на запись, выполнит обновление и снимет блокировку. После этого один из оставшихся 3-х захватит блокировку, сделает ее обновление и т.д.

Параллелизм вступает в игру только в том случае, если ваша операция не может быть заключена в одну операцию записи. Обратите внимание, что для наиболее распространенного варианта использования (найти документ, обновить его и получить новую версию атомарно) MongoDB предлагает команду «findAndModify», которая делает именно это: http://www.mongodb.org/display/DOCS/findAndModify+Command

ОБНОВЛЕНИЕ: в наши дни блокировка стала более детальной.

person Remon van Vliet    schedule 09.08.2011
comment
Спасибо, я понимаю, почему это казалось общеизвестным. - person lollancf37; 09.08.2011
comment
Пожалуйста. Это похоже на ограничивающую функцию, но поскольку запись выполняется относительно быстро, на самом деле это редко является проблемой производительности. Следите за заблокированным % в mongostat, чтобы увидеть, сколько времени проводится с заблокированной блокировкой. - person Remon van Vliet; 09.08.2011
comment
MongoDb 3.2 и более поздних версий Механизм хранения WiredTiger является механизмом хранения по умолчанию и поддерживает блокировки на уровне документа для операций записи. docs.mongodb.com/manual/core/wiredtiger/#storage-wiredtiger< /а>. - person Suraj; 20.04.2018

Используйте операции-модификаторы:

$inc $set $unset $push $pushAll $addToSet $pop $pull $pullAll $rename $bit

все они атомные.

person Karoly Horvath    schedule 09.08.2011
comment
Спасибо, что указали на эту статью, но это не гарантирует, что вы единственный, кто пишет о конкретной коллекции, не так ли? - person lollancf37; 09.08.2011
comment
пока вы используете операции модификатора, не имеет значения, сколько у вас одновременных операций записи. - person Karoly Horvath; 09.08.2011