2015-02-06 3 views
1

Как я вижу, мы можем задавать проблемы с записью приложения, мне было интересно, как MongoDB обработает такой сценарий:Как писать Концерн в MongoDB Работа на уровне темы?

Допустим, у нас есть две задачи/процесс (P1 и P2), работающие на одной базе данных (база данных имеет набор реплик из трех узлов, 1 первичный и 2 вторичный). P1 имеет проблемы с записью, включенной на уровне журнала. У P2 есть проблема с записью, включенная в реплику (средний уровень).

Теперь, что произойдет, если P1 и P2 оба будут записываться в базу данных?

Будет ли P2 ждать, когда данные, записанные P1, будут скопированы на вторичные, а затем записать свои данные на вторичный?

или как он его обрабатывает?

ответ

2

Назовите проблему за операцию и определите, когда 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 не может делать две записи в одну и ту же базу данных одновременно.

+0

Как я знаю до mongoDB 2.6, всякий раз, когда операция записи выполняется в коллекции, база данных блокируется.Неужели это не заставит второй процесс ждать? (если они оба записывают в ту же базу данных)? Аналогично, синхронизация данных, записанных P1, задерживает данные, которые должны быть записаны P2? – Kaushal

+0

Отвечено в редакторе для ответа. – wdberkeley

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