#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
Надеюсь, это поможет!