mongo是否在UpdateOneAsync调用的边界中锁定文档?

时间:2018-05-02 07:59:36

标签: c# .net mongodb mongodb-query .net-core

即使在并发环境中,我也需要使用特定值使文档字段只能更新一次。例如,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会以某种方式锁定文档,以确保它不会同时更新。

该解决方案是否有效,还是需要一些外部锁定机制?

如果问题缺少任何必要的细节,请发表评论,我很乐意提供。

1 个答案:

答案 0 :(得分:-1)

您可能需要使用global来更新云数据,否则当两个线程试图调用它时,它们不会干扰。