MongoDB 使用 .NET 的乐观并发控制
MongoDB Optimistic Concurrency Control With .NET
使用 .NET MongoDB API (MongoDB.Driver),实现乐观并发控制的推荐方法是什么?例如,是否有类似于 SQL 服务器的 ROWVERSION/TIMESTAMP 的东西,例如,每当文档更改时自动更新的 属性?或者有什么触发机制?或者任何其他机制?
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
使用 .NET MongoDB API (MongoDB.Driver),实现乐观并发控制的推荐方法是什么?例如,是否有类似于 SQL 服务器的 ROWVERSION/TIMESTAMP 的东西,例如,每当文档更改时自动更新的 属性?或者有什么触发机制?或者任何其他机制?
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