【问题标题】:Transactions like update, cross document in mongodb and C# drivermongodb 和 C# 驱动程序中的更新、跨文档等事务
【发布时间】:2017-07-20 16:51:16
【问题描述】:

我必须以类似事务的方式更新 3 个文档。

意思是,要么全部通过,要么全部失败。

我使用的是 mongo 3.2,不过升级到 3.4 不会有问题。

我尝试阅读它,但无法真正找到解决此问题的方法。

有可能吗?有BKM吗? 我需要更改我的文档设计吗?

我正在做这种将任务发送到节点的批处理机制。任务就像命令行,节点就像虚拟机。

我为 Job(多个任务的容器)存储一个文档,一个用于任务,一个用于节点。

当我提交任务时,我必须更改作业、任务和节点的状态,如果其中任何一个失败,我必须回滚其他的。

想法?

谢谢! 吉利

【问题讨论】:

  • 请提供您命名为“类似交易方式”的方法的示例。这个问题仍然存在。

标签: .net mongodb c#-4.0 transactions


【解决方案1】:

如果其中任何一个失败,我必须回滚其他的。

MongoDB v4.0 支持multi-document transactions,因此您可以将更新组合成一个原子(成功/回滚)操作。

例如,使用MongoDB C# driver v2.7.0,您可以使用类似于:

var taskCollection = client.GetDatabase("job").GetCollection<BsonDocument>("task");

session.StartTransaction(new TransactionOptions(
                             readConcern: ReadConcern.Snapshot,
                             writeConcern: WriteConcern.WMajority));

try
{
    taskCollection.UpdateOne(
                session,
                Builders<BsonDocument>.Filter.Eq("taskId", 101),
                Builders<BsonDocument>.Update.Set("status", "complete"));
    taskCollection.UpdateOne(
                session,
                Builders<BsonDocument>.Filter.Eq("nodeId", 202),
                Builders<BsonDocument>.Update.Set("status", "complete"));
}
catch (Exception exception)
{
    Console.WriteLine($"Caught exception during transaction, aborting: {exception.Message}.");
    session.AbortTransaction();
    throw;
}
session.CommitTransaction();

另见Transactions and Retryable Writes

我需要更改我的文档设计吗?

取决于您的应用程序用例,如果您可以使用embedded data model 将作业/任务/节点的所有信息合并到一个文档中,那么您不需要使用多文档事务功能。

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多