即使在并发环境中,我也需要使用特定值使文档字段只能更新一次。例如,ID为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
。重要的是,所有后续调用将继续返回与第一次相同的值。
换句话说,我需要在并发环境中使这个方法具有幂等性。
这段代码似乎运行正常,但是我不确定是否满足条件后,mongo会以某种方式锁定文档,以确保它不会同时更新。
该解决方案是否有效,还是需要一些外部锁定机制?
如果问题缺少任何必要的细节,请发表评论,我很乐意提供。
答案 0 :(得分:-1)
您可能需要使用global来更新云数据,否则当两个线程试图调用它时,它们不会干扰。