.net mongodb和C#驱动程序中的更新、交叉文档等事务

.net mongodb和C#驱动程序中的更新、交叉文档等事务,.net,mongodb,c#-4.0,transactions,.net,Mongodb,C# 4.0,Transactions,我必须以类似事务的方式更新3个文档 也就是说,要么全部通过,要么全部失败 我正在使用Mongo3.2,不过升级到3.4不会有问题 我试着读了一些关于它的文章,但没有真正找到解决这个问题的方法 有可能吗?这个有BKM吗? 我是否需要更改文档设计 我正在执行这个批处理机制,它将任务发送到节点。任务类似于命令行,节点类似于虚拟机 我为作业存储一个文档(多个任务的容器),一个用于任务,一个用于节点 提交任务时,我必须更改作业、任务和节点的状态,如果其中任何一个失败,我必须回滚其他任务 想法 谢谢! 吉利

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

也就是说,要么全部通过,要么全部失败

我正在使用Mongo3.2,不过升级到3.4不会有问题

我试着读了一些关于它的文章,但没有真正找到解决这个问题的方法

有可能吗?这个有BKM吗? 我是否需要更改文档设计

我正在执行这个批处理机制,它将任务发送到节点。任务类似于命令行,节点类似于虚拟机

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

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

想法

谢谢! 吉利

如果其中任何一个失败了,我就得把其他的退回去

MongoDB v4.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();
var taskCollection=client.GetDatabase(“作业”).GetCollection(“任务”);
会话.启动交易(新交易选项)(
readConcern:readConcern.Snapshot,
writeConcern:writeConcern.WMajority));
尝试
{
taskCollection.UpdateOne(
一场
Builders.Filter.Eq(“taskId”,101),
Builders.Update.Set(“状态”、“完成”);
taskCollection.UpdateOne(
一场
Builders.Filter.Eq(“nodeId”,202),
Builders.Update.Set(“状态”、“完成”);
}
捕获(异常)
{
Console.WriteLine($“在事务期间捕获异常,正在中止:{exception.Message}”);
session.AbortTransaction();
投掷;
}
session.CommitTransaction();
另见

我是否需要更改文档设计

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

如果其中任何一个失败了,我就得把其他的退回去

MongoDB v4.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();
var taskCollection=client.GetDatabase(“作业”).GetCollection(“任务”);
会话.启动交易(新交易选项)(
readConcern:readConcern.Snapshot,
writeConcern:writeConcern.WMajority));
尝试
{
taskCollection.UpdateOne(
一场
Builders.Filter.Eq(“taskId”,101),
Builders.Update.Set(“状态”、“完成”);
taskCollection.UpdateOne(
一场
Builders.Filter.Eq(“nodeId”,202),
Builders.Update.Set(“状态”、“完成”);
}
捕获(异常)
{
Console.WriteLine($“在事务期间捕获异常,正在中止:{exception.Message}”);
session.AbortTransaction();
投掷;
}
session.CommitTransaction();
另见

我是否需要更改文档设计


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

请提供您称之为“类似交易方式”的方法示例。问题仍然存在。请提供您称之为“类似交易的方式”的方法示例。这个问题仍然是现实的。