gpt4 book ai didi

单个 MongoDB 实例上的 C# MongoDB 驱动程序事务

转载 作者:行者123 更新时间:2023-12-03 15:59:34 24 4
gpt4 key购买 nike

我正在使用 MongoDB 4.0.8 和 C# 驱动程序 2.8.1,并且我正在尝试在我的项目中实现 Transactions。我复制粘贴了以下代码示例:

static async Task<bool> UpdateProducts()
{
//Create client connection to our MongoDB database
var client = new MongoClient(MongoDBConnectionString);

//Create a session object that is used when leveraging transactions
var session = client.StartSession();

//Create the collection object that represents the "products" collection
var products = session.Client.GetDatabase("MongoDBStore").GetCollection<Product>("products");

//Clean up the collection if there is data in there
products.Database.DropCollection("products");

//Create some sample data
var TV = new Product { Description = "Television", SKU = 4001, Price = 2000 };
var Book = new Product { Description = "A funny book", SKU = 43221, Price = 19.99 };
var DogBowl = new Product { Description = "Bowl for Fido", SKU = 123, Price = 40.00 };

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

try
{
//Insert the sample data
await products.InsertOneAsync(session, TV);
await products.InsertOneAsync(session, Book);
await products.InsertOneAsync(session, DogBowl);

var filter = new FilterDefinitionBuilder<Product>().Empty;
var results = await products.Find(filter).ToListAsync();

//Increase all the prices by 10% for all products
var update = new UpdateDefinitionBuilder<Product>().Mul<Double>(r => r.Price, 1.1);
await products.UpdateManyAsync(session, filter, update); //,options);

//Made it here without error? Let's commit the transaction
session.CommitTransaction();

//Let's print the new results to the console
Console.WriteLine("Original Prices:\n");
results = await products.Find<Product>(filter).ToListAsync();
foreach (Product d in results)
{
Console.WriteLine(String.Format("Product Name: {0}\tPrice: {1:0.00}", d.Description, d.Price));
}
}
catch (Exception e)
{
Console.WriteLine("Error writing to MongoDB: " + e.Message);
session.AbortTransaction();
}
return true;
}

但是在第一个 Insert 命令中,我收到此错误:

Command insert failed:
Transaction numbers are only allowed on a replica set member or mongos.

Documentation说:

Starting in version 4.0, MongoDB provides the ability to perform multi-document transactions against replica sets.

我的项目中没有副本,我只有一个数据库实例,这是我的主要数据库实例。是否有我可以用来实现交易的解决方案或解决方法?我有可以更新多个集合的方法,我真的认为它可以节省我使用它的时间。

最佳答案

如文档所述,事务仅适用于副本集。因此您需要将 mongodb 服务器作为单节点副本集运行。为此,请执行以下步骤...

第 1 步:停止 mongodb 服务器。

第 2 步:replication 设置添加到您的mongod.cfg 文件中。这是我自己的例子

storage:
dbPath: C:\DATA
directoryPerDB: true
journal:
enabled: true

systemLog:
destination: file
logAppend: true
path: C:\DATA\log\mongod.log

net:
port: 27017
bindIp: 127.0.0.1

replication:
replSetName: MyRepSet

第 3 步:打开 mongodb shell 并发出以下命令来启动副本集。

rs.initiate()

第 4 步:重新启动 mongod

<小时/>

顺便说一句,如果您想编写如下所示的更清晰、更方便的事务代码,请查看我的库 MongoDB.Entities

    using (var TN = new Transaction())
{
var author = new Author { Name = "one" };

TN.Save(author);

TN.Delete<Book>(book.ID);

TN.Commit();
}

关于单个 MongoDB 实例上的 C# MongoDB 驱动程序事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com