Монго блокирует документы в границах вызова UpdateOneAsync? - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно сделать поле документа обновляемым только один раз с определенным значением, даже в параллельной среде. Например, документ с идентификатором 123456 имеет (строковое) поле SomeField с начальным значением, равным null. Я придумал код, который выглядит так:

public async Task<bool> SetSomeField(string id, string value)
{
    var updateResult = await GetCollection().UpdateOneAsync(
        x =>
            x.Id == id &&
            (!x.SomeField.HasValue || x.SomeField.Value == value),
        Builders<SomeDocument>
            .Update
            .Set("SomeField", value));

    return updateResult.MatchedCount != 0;
}

Если два потока пытаются вызвать этот метод, например, как await SetSomeField("123456", "value1") и await SetSomeField("123456", "value2"), один вызов должен установить значение SomeField и вернуть true, а другой должен вернуть false. Важно, чтобы все последующие вызовы продолжали возвращать то же значение, что и в первый раз.

Другими словами, мне нужно сделать этот метод идемпотентным в параллельной среде.

Этот код работает нормально, однако я не уверен, что после выполнения условия Монго каким-либо образом блокирует документ, чтобы убедиться, что он не обновляется одновременно.

Будет ли это решение работать, или мне нужны внешние механизмы блокировки?

Пожалуйста, прокомментируйте, если в вопросе отсутствуют какие-либо необходимые детали, я буду рад предоставить их.

1 Ответ

0 голосов
/ 12 мая 2018

Вам может понадобиться использовать global для обновления облачных данных, иначе, когда два потока попытаются вызвать его, они не будут вмешиваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...