Mongo 带 C# 的数据库 - 无论事务如何都添加了文档
Mongo DB with C# - document added regardless of transaction
我正在尝试使用我编写的一个简单示例来测试 Mongo 数据库中新支持的事务。
我正在使用 Mongo 数据库版本 4.0.5 和驱动程序版本 2.8.1。
它只是一个没有 shards/replicas.
的主要实例
我一定是遗漏了以下代码中的一些基本内容。
我创建了一个 Mongo 客户端、会话和数据库,然后启动事务、添加文档并中止事务。在此代码之后,我希望数据库中不会发生任何变化,但会添加文档。调试时,我还可以使用 Robo 3T(Mongo 客户端 GUI)在 InsertOne()
之后看到文档。
知道我错过了什么吗?
var client = new MongoClient("mongodb://localhost:27017");
var session = client.StartSession();
var database = session.Client.GetDatabase("myDatabase", new MongoDatabaseSettings
{
GuidRepresentation = GuidRepresentation.Standard,
ReadPreference = ReadPreference.Primary,
WriteConcern = new WriteConcern(1,
new MongoDB.Driver.Optional<TimeSpan?>(TimeSpan.FromSeconds(30))),
});
var entities = database.GetCollection<MyEntity>("test");
session.StartTransaction();
// After this line I can already see the document in the db collection using Mongo client GUI (Robo 3T), although I expect not to see it until committing
entities.InsertOne(new MyEntity { Name = "Entity" });
// This does not have any effect
session.AbortTransaction();
编辑:
可以将 运行 MongoDB 作为 1 节点副本集,尽管我不确定独立副本集和 1 节点副本集之间有什么区别。
请参阅下面我的 post。
无论如何,要使用启动的事务,插入代码必须接收会话作为参数:
entities.InsertOne(session, new MyEntity { Name = "Entity" });
现在有了这 2 个更改,交易就可以进行了。
这本质上是 MongoDB 本身的 属性。 (更多here and here)
Transactions are only available in a replica set setup
为什么它不适用于独立实例?
通过子文档和数组,文档数据库 (MongoDB) 允许相关数据在单个数据结构中分层统一。可以使用原子操作更新文档,为其提供与关系数据库中的 multi-table 事务相同的数据完整性保证。
我找到了解决办法,虽然不确定后果是什么,也许有人可以指出来:
似乎可以通过在 mongod.cfg 文件中添加以下内容来将 Mongo 数据库用作 1 节点副本集(而不是独立副本集):
replication:
replSetName: rs1
此外,由于以下 link,代码应该使用 InsertOne()
的正确重载,它接收会话作为第一个参数(参见对原始 post 的编辑) :
multiple document transaction not working in c# using mongodb 4.08 community server
我正在尝试使用我编写的一个简单示例来测试 Mongo 数据库中新支持的事务。 我正在使用 Mongo 数据库版本 4.0.5 和驱动程序版本 2.8.1。 它只是一个没有 shards/replicas.
的主要实例我一定是遗漏了以下代码中的一些基本内容。
我创建了一个 Mongo 客户端、会话和数据库,然后启动事务、添加文档并中止事务。在此代码之后,我希望数据库中不会发生任何变化,但会添加文档。调试时,我还可以使用 Robo 3T(Mongo 客户端 GUI)在 InsertOne()
之后看到文档。
知道我错过了什么吗?
var client = new MongoClient("mongodb://localhost:27017");
var session = client.StartSession();
var database = session.Client.GetDatabase("myDatabase", new MongoDatabaseSettings
{
GuidRepresentation = GuidRepresentation.Standard,
ReadPreference = ReadPreference.Primary,
WriteConcern = new WriteConcern(1,
new MongoDB.Driver.Optional<TimeSpan?>(TimeSpan.FromSeconds(30))),
});
var entities = database.GetCollection<MyEntity>("test");
session.StartTransaction();
// After this line I can already see the document in the db collection using Mongo client GUI (Robo 3T), although I expect not to see it until committing
entities.InsertOne(new MyEntity { Name = "Entity" });
// This does not have any effect
session.AbortTransaction();
编辑:
可以将 运行 MongoDB 作为 1 节点副本集,尽管我不确定独立副本集和 1 节点副本集之间有什么区别。 请参阅下面我的 post。
无论如何,要使用启动的事务,插入代码必须接收会话作为参数:
entities.InsertOne(session, new MyEntity { Name = "Entity" });
现在有了这 2 个更改,交易就可以进行了。
这本质上是 MongoDB 本身的 属性。 (更多here and here)
Transactions are only available in a replica set setup
为什么它不适用于独立实例?
通过子文档和数组,文档数据库 (MongoDB) 允许相关数据在单个数据结构中分层统一。可以使用原子操作更新文档,为其提供与关系数据库中的 multi-table 事务相同的数据完整性保证。
我找到了解决办法,虽然不确定后果是什么,也许有人可以指出来: 似乎可以通过在 mongod.cfg 文件中添加以下内容来将 Mongo 数据库用作 1 节点副本集(而不是独立副本集):
replication:
replSetName: rs1
此外,由于以下 link,代码应该使用 InsertOne()
的正确重载,它接收会话作为第一个参数(参见对原始 post 的编辑) :
multiple document transaction not working in c# using mongodb 4.08 community server