2015-11-25 71 views
4

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

回答

4

关于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 
+1

很好的例子:)不过,一般来说,你应该使用'DateTime's解决技术这样的东西,因为它是不可靠的远离 - [“每秒1秒更难比它听起来的要多“](https://rachelbythebay.com/w/2014/06/14/time/),但也有简单的棘手的东西,如夏令时,可以激起时钟总是增加的概念,将永远不会再一样。 我建议你在文档的'Revision'字段中使用一个好的''int'',然后每次执行编辑时增加它。 – mookid8000

+1

@ mookid8000 MongoDB中的所有日期都是以UTC表示的,但不管怎么说都不错。 – i3arnon

+0

哦,是的,没错 - 忘记节省时间);但时钟往返漂移实际上非常普遍,如果你的更新频繁,你会在某些时候被这个打击 - 在这种情况下,你会失去另一个更新者的编辑,你可能永远不知道为什么会发生。微妙 - 令人恐惧! :-o – mookid8000