Управлять параллельным доступом mongoDB

мне нужно управлять параллельным доступом для обновлений данных в mongoDB. Пример: два пользователя a и b подключаются к моему приложению. Пользователь a обновил данные, а пользователь b хочет обновить те же данные, которые уже обновил пользователь a, поэтому я хочу, чтобы пользователь b не мог обновить эти данные, потому что они уже обновлены пользователем a.

попробуйте использовать операцию compareAndSe

TongChen 30.01.2019 11:10

@TongChen, пожалуйста, не могли бы вы привести пример использования compareAndSet

user9948851 30.01.2019 11:17

Возможно, взгляните на аннотацию javax.persistence @Version. stackoverflow.com/questions/10648515/…

RichieK 30.01.2019 19:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
59
1

Ответы 1

если пользователь A и пользователь B обновляют только один документ, и вы можете знать начальное значение и обновленное значение, попробуйте этот код:

Код пытается обновить поле секрет, и мы знаем, что начальное значение равно экспертСекрет.

public void compareAndSet(String expertSecret, String targetSecret) {
    // get a mongodb collection
    MongoCollection<Document> collection = client.getDatabase(DATABASE).getCollection(COLLECTION);
    BasicDBObject filter = new BasicDBObject();
    filter.append("secret", expertSecret);
    BasicDBObject update = new BasicDBObject();
    update.append("secret", targetSecret);
    collection.updateOne(filter, update);
}

Если не знаете начальное значение, как это сделать?

вы можете добавить поле в репрезентативную операцию и перед обновлением проверить поле.

Если нужно обновить более одного документа, как это сделать? Для поддержки транзакций с несколькими документами требуется сервер mongo, получите дополнительную информацию от здесь.

However, for situations that require atomicity for updates to multiple documents or consistency between reads to multiple documents, MongoDB provides the ability to perform multi-document transactions against replica sets. Multi-document transactions can be used across multiple operations, collections, databases, and documents. Multi-document transactions provide an “all-or-nothing” proposition.

спасибо, я постараюсь добавить поле и проверить его, прежде чем делать обновление. Есть ли способ создать последовательность в mongodb с данными Spring, которые автоматически увеличиваются после каждого обновления или вставки?

user9948851 30.01.2019 13:46

Mongodb имеет оператора $inc, вы можете найти ту же операцию в Spring Data.

TongChen 30.01.2019 13:49

Другие вопросы по теме