带有C#的Mongo DB-添加文档而不考虑事务

时间:2019-05-27 08:28:15

标签: c# mongodb transactions mongodb-.net-driver

我正在尝试用我编写的一个简单示例测试Mongo DB中新支持的事务。 我正在将Mongo DB版本4.0.5与驱动程序版本2.8.1结合使用。 这只是一个没有分片/副本的主实例。

我必须在以下代码中缺少一些基本知识。 我创建一个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节点副本集有什么区别。 请参阅下面的我的帖子。

无论如何,要使用已启动的事务,插入代码必须将会话作为参数接收:

entities.InsertOne(session, new MyEntity { Name = "Entity" });

现在有了这两项更改,交易就可以了。

2 个答案:

答案 0 :(得分:2)

这本质上是MongoDB本身的属性。 (更多enter image description herehere

  

交易仅在副本集设置中可用

为什么它不能用于独立实例?

借助子文档和数组,文档数据库(MongoDB)允许相关数据在单个数据结构内按层次结构进行统一。可以使用原子操作来更新文档,从而为文档提供与关系数据库中的多表事务相同的数据完整性保证。

答案 1 :(得分:0)

我找到了解决方案,尽管不确定会带来什么后果,也许有人可以指出: 通过在mongod.cfg文件中简单添加以下内容,似乎可以将Mongo DB用作1节点副本集(而不是独立副本):

replication:
   replSetName: rs1

此外,由于下面的链接,代码应使用正确的InsertOne()重载,该重载将会话作为第一个参数(请参见原始文章的编辑内容):

multiple document transaction not working in c# using mongodb 4.08 community server