Mongodb блокирует между большими группами? - PullRequest
0 голосов
/ 14 июня 2019

Дано собрание, содержащее документы следующего формата:

{ 
  name:String,
  members: [ { name:String, type: String } ]
}

Допустим, у меня есть массовая операция mongodb, содержащая две операции:

  • A) для получения списка предоставленных документов удалите все элементы с типом 'x'
  • B) для этого же списка заданных документов добавьте набор членов с типом 'x'

Вопрос в том: заблокирует ли mongodb документы между А и В? Чтобы никакие изменения «членов» целевых документов не могли выполняться другими процессами между A и B?

1 Ответ

1 голос
/ 19 июня 2019

Нет, не будет. По умолчанию операции MongoDB будут атомарными для каждого документа, а не внутри группы документов (именно такова массовая операция).

Цитировать со страницы Атомность и транзакции :

В MongoDB операция записи является атомарной на уровне одного документа, даже если операция изменяет несколько встроенных документов в одном документе.

Также:

Когда одна операция записи (например, db.collection.updateMany ()) изменяет несколько документов, модификация каждого документа является атомарной, но операция в целом не является атомарной.

MongoDB 4.0, однако, поддерживает многодокументные транзакции ACID с некоторыми ограничениями, например, поддерживает только для наборов реплик, а общие данные в транзакции не могут превышать 16 МБ.

Что касается Spring, в выпуске Lovelace поддерживаются транзакции MongoDB 4.0 ( DATAMONGO-1920 ). В этом блоге Pivotal есть примеры .

...