【问题标题】:MongoDB Optimistic Concurrency Control With .NET.NET 的 MongoDB 乐观并发控制
【发布时间】:2019-04-12 23:22:10
【问题描述】:

使用 .NET MongoDB API (MongoDB.Driver),实现乐观并发控制的推荐方法是什么?例如,是否有任何类似于 SQL Server 的 ROWVERSION/TIMESTAMP 的东西,例如,每当文档更改时自动更新的属性?还是有触发机制?还是其他机制?

【问题讨论】:

标签: .net mongodb mongodb-.net-driver optimistic-concurrency


【解决方案1】:

MongoDB 中没有任何关于乐观并发的内置功能。如果需要,您需要自己实现。

您可以通过添加DateTime 时间戳、在执行更新之前读取它并使用该时间戳作为更新过滤器来做到这一点。如果在您有机会更新之前更改了时间戳,那么更新操作将无法找到该文档。

例如:

UpdateResult updateResult;
do
{
    var document = await collection.Find(_ => _.Id == id).SingleAsync(); // Get the current document
    updateResult = await collection.UpdateOneAsync(_ => _.Id == id && _.TimeStamp == document.TimeStamp, Builders<Item>.Update...); // Update the document only if the timestamp is the same
} while (updateResult.ModifiedCount == 0); // Try until an update was successfull

【讨论】:

  • 很好的例子 :) 虽然,一般来说,你应该远离使用 DateTimes 来解决这样的技术问题,因为它不可靠 - "1 second per second is harder than it sounds" 浮现在脑海中,但也有一些简单的棘手问题,比如夏令时,可以激起时钟总是在增加并且永远不会再一样的观念。我建议您在文档中的 Revision 字段中使用旧的 int,然后在每次执行编辑时增加它。
  • @mookid8000 MongoDB 中的所有日期都是 UTC,但它仍然是一个好点。
  • 哦,是的,那是对的 - 忘记白天节省时间了;)但是时钟来回漂移实际上很常见,如果你的更新频繁,你会在某个时候受到这个打击 -在这种情况下,您将丢失其他更新程序的编辑,您可能永远不会知道它为什么会发生。微妙 - 和可怕的! :-o
  • 这个答案仍然是当前推荐的处理方法吗?或者 MongoDb 中是否有增强功能可以提供帮助?
  • 只是提示:如果 updateResult.IsAcknowledged 为 false,访问 updateResult.ModifiedCount 会抛出异常。因此,在使用 ModifiedCount 之前,请确保 IsAcknowledged 为真。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多