.net mongodb和C#驱动程序中的更新、交叉文档等事务
我必须以类似事务的方式更新3个文档 也就是说,要么全部通过,要么全部失败 我正在使用Mongo3.2,不过升级到3.4不会有问题 我试着读了一些关于它的文章,但没有真正找到解决这个问题的方法 有可能吗?这个有BKM吗? 我是否需要更改文档设计 我正在执行这个批处理机制,它将任务发送到节点。任务类似于命令行,节点类似于虚拟机 我为作业存储一个文档(多个任务的容器),一个用于任务,一个用于节点 提交任务时,我必须更改作业、任务和节点的状态,如果其中任何一个失败,我必须回滚其他任务 想法 谢谢! 吉利 如果其中任何一个失败了,我就得把其他的退回去 MongoDB v4.0支持,因此您可以将更新分组到一个原子(成功/一起回滚)操作中 例如,使用,您可以使用类似于:.net mongodb和C#驱动程序中的更新、交叉文档等事务,.net,mongodb,c#-4.0,transactions,.net,Mongodb,C# 4.0,Transactions,我必须以类似事务的方式更新3个文档 也就是说,要么全部通过,要么全部失败 我正在使用Mongo3.2,不过升级到3.4不会有问题 我试着读了一些关于它的文章,但没有真正找到解决这个问题的方法 有可能吗?这个有BKM吗? 我是否需要更改文档设计 我正在执行这个批处理机制,它将任务发送到节点。任务类似于命令行,节点类似于虚拟机 我为作业存储一个文档(多个任务的容器),一个用于任务,一个用于节点 提交任务时,我必须更改作业、任务和节点的状态,如果其中任何一个失败,我必须回滚其他任务 想法 谢谢! 吉利
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();
另见
我是否需要更改文档设计
取决于您的应用程序用例,如果您可以使用将作业/任务/节点的所有信息合并到单个文档中,则不需要使用多文档事务功能 请提供您称之为“类似交易方式”的方法示例。问题仍然存在。请提供您称之为“类似交易的方式”的方法示例。这个问题仍然是现实的。