Это немного широк, но я могу предложить широкие штрихи. Начиная с MongoDB используется collection level locking с механизмом хранения по умолчанию. Существует также механизм хранения WiredTiger, который реализует document level locking. Но в основном во всех выпусках есть некоторый уровень «блокировки», который происходит при каждом запросе. Чем лучше уровень, тем лучше в зависимости от вашей фактической пропускной способности.
По существу, ни одно из двух запросов не происходит одновременно, поскольку они будут «блокировать» блокировку, созданную до ее освобождения. Таким образом, значение, которое будет возвращено (например, запрос findAndModify()
), будет иметь значение «текущего состояния», когда этот запрос был выполнен.
Таким образом, при таком запросе оператор, который был выполнен первым, вернет значение 2, а следующий исполняемый оператор вернет значение 3. Конечная позиция в базе данных состоит в том, что в настоящее время значение будет равно 3.
Таким образом, невозможно что-то «изменить» одновременно, а конечным состоянием будет то, что происходит после выдачи «всех» запросов. Таким образом, $inc
и другие операторы выполняют точно так, как должны, и изменяют контент на основе состояния документа в тот момент, когда он действительно мог получить к нему доступ.