我正在尝试使用我编写的一个简单示例来测试 Mongo DB 中新支持的事务。我正在使用 Mongo DB 版本 4.0.5 和驱动程序版本 2.8.1。它只是一个没有分片/副本的主实例。
我一定在下面的代码中遗漏了一些基本的东西。我创建了一个 Mongo 客户端、会话和数据库,然后开始一个事务,添加一个文档并中止事务。在此代码之后,我希望数据库中没有任何变化,但添加了文档。调试时,我还可以在InsertOne()
使用 Robo 3T(Mongo 客户端 GUI)之后立即查看文档。
知道我错过了什么吗?
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 节点副本集之间有什么区别。看我下面的帖子。
在任何情况下,要使用已启动的事务,插入代码必须接收会话作为参数:
entities.InsertOne(session, new MyEntity { Name = "Entity" });
有了这 2 个更改,交易现在可以工作了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句