Вы абсолютно правы, вам определенно не следует блокировать всю коллекцию только для обновления одного документа.
Теперь эта проблема зависит от того, как вы обновляете свой документ. Если вы обновите свой документ с помощью одного запроса на обновление, то, поскольку обновление документа - atomi c, у вас не будет проблем.
Но если вам сначала нужно прочитать документ, изменить документ, сохранить документ, тогда у вас возникнет проблема параллелизма. Непосредственно перед тем, как вы сохраните измененный документ, он может быть обновлен по другому запросу, и документ, который вы прочитали, больше не будет актуальным, следовательно, ваши новые обновления также не будут правильными.
Простое решение для эта проблема параллелизма решается сохранением номера версии (обычно _v
) в каждом из ваших документов. И для каждого обновления вы увеличиваете номер версии. Затем каждый раз, когда вы выполняете чтение, изменение и обновление, вы убедитесь, что версия вашего прочитанного документа и версия этого документа в базе данных идентичны. Если номер версии отличается, обновление завершится неудачно, и вы можете просто повторить попытку.
Если вы используете node.js
, то вы, вероятно, используете mongoose
, а mongoose
будет генерировать _v
и выполнять параллелизм проверки за кадром. Таким образом, вам не нужно выполнять дополнительную работу для решения этой проблемы параллелизма.