MongoDB多文档事务,读取未提交的数据

时间:2018-11-08 12:51:00

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

直到MongoDB v4.0,多文档事务都是通过实施两阶段提交来实现的。 在4.0之后,MongoDB引入了副本集的多文档事务。根据他们的文档; “直到提交事务为止,在事务外部看不到事务中的任何写入/更新操作”。 但是,交易范围内数据的可见性如何? 为了简单起见,我实现了下面的示例,描述了这种情况。

            var client = new MongoClient("mongodb://localhost");
            var session = client.StartSession();
            var ColA = session.Client.GetDatabase("Testing").GetCollection<BsonDocument>("ColA");
            JObject Obj = new JObject();
            Obj.Add("A", "ValA");
            session.StartTransaction();
            ColA.InsertOne(session, BsonDocument.Parse(Obj.ToString()));
            var tt = ColA.Find(new BsonDocument { }).ToList();
            session.CommitTransaction();

在原点,"ColA"是一个空集合,当我插入文档然后尝试查询(tt = ColA.Find...)时,结果集仍然为空。 我知道在事务作用域之外,结果集在提交之前应该保持为空,但是为什么在作用域内它为空。

通过使用相同的逻辑在SQL Server上重现相同的场景,在事务范围内插入后查询表,然后在提交之前返回数据。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

它可以按预期工作,代码中唯一缺少的是将session作为参数传递给Find方法,请尝试:

session.StartTransaction();
ColA.InsertOne(session, BsonDocument.Parse(Obj.ToString()));
var tt = ColA.Find(session, Builders<BsonDocument>.Filter.Empty).ToList();

session.CommitTransaction();