Вы можете использовать другую коллекцию для сохранения последовательности идентификаторов.Каждый раз, когда кто-то запрашивает новый идентификатор, метод гарантирует, что он увеличивает идентификатор.
@Document
public class CollectionSeq {
@Id
@Indexed( unique = true)
private String collection;
private long current = 1;
}
Вы можете получить следующий идентификатор:
public long next(String collection) {
CollectionSeq next = operations.findAndModify(
query(where("collection").is(collection)),
new Update().inc("current", 1),
options().returnNew(true).upsert(true),
CollectionSeq.class
);
return Objects.requireNonNull(next).getCurrent();
}
И прежде, чем сохранить новый документколлекции присваивают идентификатор.
Item item = new Item();
item.setId(collectionSeqRepository.next("item"));
item.setVersion(4);
...
itemRepository.save(item)
Коллекция секвенсора выглядит следующим образом:
collection: item, current: 3
collection: book, current: 100
collection: version, current: 4
Согласно официальным документам, MongoDB предоставляет изолированное обновление и возврат.
Вот официальная ссылка на документ MongoDB: Почему findAndModify является атомарным.
Управление параллелизмом позволяет одновременно запускать несколько приложений, не вызывая несогласованности данных или конфликтов.
Один из подходов заключается в создании уникального индекса для поля, которое может иметь только уникальные значения.Это не позволяет вставкам или обновлениям создавать дубликаты данных.Создайте уникальный индекс для нескольких полей, чтобы обеспечить уникальность этой комбинации значений полей.Примеры примеров использования см. В разделах update () и Unique Index, а также findAndModify () и Unique Index.
Другой подход заключается в указании ожидаемого текущего значения поля в предикате запроса для операций записи.