Мне нужно сделать поле документа обновляемым только один раз с определенным значением, даже в параллельной среде. Например, документ с идентификатором 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
. Важно, чтобы все последующие вызовы продолжали возвращать то же значение, что и в первый раз.
Другими словами, мне нужно сделать этот метод идемпотентным в параллельной среде.
Этот код работает нормально, однако я не уверен, что после выполнения условия Монго каким-либо образом блокирует документ, чтобы убедиться, что он не обновляется одновременно.
Будет ли это решение работать, или мне нужны внешние механизмы блокировки?
Пожалуйста, прокомментируйте, если в вопросе отсутствуют какие-либо необходимые детали, я буду рад предоставить их.