Назовите проблему за операцию и определите, когда MongoDB сообщает клиенту, что запись прошла успешно. Это не имеет ничего общего с другими операциями, которые происходят примерно в одно и то же время.
Если у P1 есть проблема с записью, включенная на уровне журнала, которую я беру, чтобы иметь в виду журналистское беспокойство { "j" : 1 }
, MongoDB не сообщит, что операции, отправленные P1, будут успешными до тех пор, пока они не будут зафиксированы в журнале. Неважно, что такое состояние P2.
Если у P2 есть проблема с записью, включенная на уровне реплик, что я принимаю, чтобы иметь в виду большинство проблем записи { "w" : "majority" }
, тогда каждая операция P2 не будет объявлена успешной, пока она не будет реплицирована на большинство узлов в наборе реплик , Неважно, что такое состояние P1.
Операции P1 и P2 не будут дожидаться, когда интерес к записи других вопросов будет выполнен до их продолжения или что-то в этом роде.
Edited ответ на комментарий в ответ, так как ответ долго:
Да, вторая запись будет ждать блокировки записи базы данных, который будет выпущен в первой записи (возможно, в середине сначала записывается многодокументный документ, если первая запись дает блокировку), но вторая запись не должна ждать, пока первая запись выполнит всю проблему с записью.
В качестве примера рассмотрим запись A
с { "w" : "majority" }
и напишите B
с { "w" : 1 }
. A
прибывает первым на первичном и берет замок записи. B
прибывает второй и ждет блокировки записи. A
заканчивает использование блокировки записи и освобождает его; B
берет замок. Запись A
должна быть скопирована на второстепенные, чтобы выполнить свою проблему с записью - это происходит одновременно с тем, что B
содержит блокировку записи. B
и MongoDB отвечает клиенту, что запись прошла успешно. A
завершает репликацию до необходимого количества членов набора реплик, и MongoDB отвечает, что запись была успешной. A
был отправлен до B
и написал на первичной версии до B
, в течение которого он удерживал блокировку и блокировал B
, но B
вернулся первым. Дело не в проблеме A
, которая держит B
, это более простой факт, что MongoDB не может делать две записи в одну и ту же базу данных одновременно.
Как я знаю до mongoDB 2.6, всякий раз, когда операция записи выполняется в коллекции, база данных блокируется.Неужели это не заставит второй процесс ждать? (если они оба записывают в ту же базу данных)? Аналогично, синхронизация данных, записанных P1, задерживает данные, которые должны быть записаны P2? – Kaushal
Отвечено в редакторе для ответа. – wdberkeley