如何处理来自.net类的多线程MongoDb更新?

如何处理来自.net类的多线程MongoDb更新?,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,MongoDb,c#驱动程序:两个线程从MongoDb获取同一个文档,更改其状态并将其更新回数据库。我希望每个线程都能检测到在阅读和更新此文档的过程中,其他线程是否做了任何更改。如果这些更改是由其他线程完成的,我不希望当前线程覆盖它们,我希望记录这些信息。请让我知道可能的解决办法。我知道有MongoCollection.Update和MongoCollection.find和modify方法,在这些方法中,我可以根据从数据库中获取的信息定义查询,但我看不到任何方法来检测文档是否被实际找到和更新,

MongoDb,c#驱动程序:两个线程从MongoDb获取同一个文档,更改其状态并将其更新回数据库。我希望每个线程都能检测到在阅读和更新此文档的过程中,其他线程是否做了任何更改。如果这些更改是由其他线程完成的,我不希望当前线程覆盖它们,我希望记录这些信息。请让我知道可能的解决办法。我知道有
MongoCollection.Update
MongoCollection.find和modify
方法,在这些方法中,我可以根据从数据库中获取的信息定义查询,但我看不到任何方法来检测文档是否被实际找到和更新,没有更新返回的记录数之类的信息。

据我所知,您需要

实现乐观锁定的一种简单方法是对文档进行版本设置,并在每次更新时增加版本号,即

public void Update(MyClass document)
{
    db.GetCollection<MyClass>("MyClass").Update(
        Query.And(
            Query<MyClass>.EQ(p => p.Id, document.Id), 
            Query<MyClass>(p => p.Version, document.Version),
            Update<MyClass>.Replace(document).Inc(p => p.Version));
}
公共作废更新(MyClass文档)
{
db.GetCollection(“MyClass”).Update(
查询.及(
EQ(p=>p.Id,document.Id),
查询(p=>p.Version,document.Version),
Update.Replace(document.Inc)(p=>p.Version));
}
现在让我们假设两个线程A和B同时执行操作:

  • 已读文档id 8,版本=5
  • B读取文件id 8,版本=5
  • B存储更新id 8,版本=6
  • 试图在文档id 8版本5上存储更新,但这样的对象已不存在

MongoCollection.Update
返回一个
WriteConcernResult
,该结果具有一个属性
documentsafected
,可用于检查文档是否已更新


另请参阅MongoDB文档:

文档受影响
这正是我需要的!谢谢