Одновременное чтение / запись в MongoDB

#java #mongodb #concurrency #jvm #locking

#java #mongodb #параллелизм #jvm #блокировка

Вопрос:

У меня есть коллекция, из которой я получаю максимальный идентификатор и при вставке использую максимальный идентификатор 1. Столбец id уникален в этой коллекции.

Когда вызывается несколько экземпляров этой службы, параллельное приложение считывает одну и ту же коллекцию и получает максимальный идентификатор. Но поскольку осуществляется доступ к одной и той же коллекции, один и тот же максимальный идентификатор возвращается нескольким экземплярам, могу ли я получить явную блокировку коллекции при чтении данных из этой коллекции и снять блокировку после записи в Mongo DB?

Комментарии:

1. Вы пробовали использовать внешнюю синхронизацию или встроенные синхронизированные коллекции?

2. Не могли бы вы уточнить, есть ли у нас синхронизированные коллекции в MongoDB?

3. Не могли бы вы написать немного больше о том, чего вы хотите достичь? Похоже, вам нужны транзакции, так что, возможно, MongoDB здесь не самый лучший вариант. Рассмотрите возможность автоматического увеличения поля последовательности или $inc , если вам просто нужен атомарный способ увеличения некоторого счетчика.

4. Приложение написано там, где серверной частью является Mongo DB. Я представил сервис, в котором мы хотим выполнить автоматическое увеличение в коллекции MongoDB. Поскольку открыто несколько экземпляров этой службы, несколько служб пытаются одновременно получить доступ к базе данных и обновить ее, что вызывает несоответствие в базе данных.

Ответ №1:

Используя метод MongoDB collections.findAndModify() , вы можете создать свой собственный запрос «get-and-increment».

Например:

 db.collection_name.findAndModify({
  query: { document_identifier: "doc_id_1" },
  update: { $inc: { max_id: 1 } },
  new: true  //return the document AFTER it's updated
})
  

https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/

Взгляните на эту страницу для получения дополнительной справки:

https://www.tutorialspoint.com/mongodb/mongodb_autoincrement_sequence.htm

Комментарии:

1. это здорово! Вы получили мой. 1.

2. итак, добавляет ли это перед выполнением блокировку документа?

Ответ №2:

Попробуйте этот подход

Вместо того, чтобы получать max id in чтение коллекции и увеличивать ее как max id 1 .

При чтении для нескольких экземпляров просто укажите документ / коллекцию, а при обновлении следуйте приведенной ниже логике

 Let us have the below part in a synchronized block, so that no two threads gets the same max id
synchronize() {
  getMaxId from collection
  increase it by 1
  insert the new document
}
  

Пожалуйста, обратитесь:

https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/

https://www.tutorialspoint.com/mongodb/mongodb_autoincrement_sequence.htm

Надеюсь, это поможет!