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

C# MongoDB多文档事务,读取未提交的数据,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,在MongoDB v4.0之前,多文档事务是通过实现两阶段提交来实现的。 在4.0之后,MongoDB引入了副本集的多文档事务;根据他们的文件;“在提交事务之前,事务中的写入/更新操作在事务外部不可见”。 但是事务范围内数据的可见性如何呢? 为了简单起见,我实现了下面的示例,它描述了这种情况 var client = new MongoClient("mongodb://localhost"); var session = client.Start

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();
var客户端=新的MongoClient(“mongodb://localhost");
var session=client.StartSession();
var ColA=session.Client.GetDatabase(“测试”).GetCollection(“ColA”);
JObject Obj=新的JObject();
对象添加(“A”、“ValA”);
session.StartTransaction();
InsertOne(session,BsonDocument.Parse(Obj.ToString());
var tt=ColA.Find(新的BsonDocument{}.ToList();
session.CommitTransaction();
在origin中,
“ColA”
是一个空集合,当我插入文档并尝试查询它时(tt=ColA.Find…),结果集仍然是空的。 我知道在事务范围之外,结果集在提交之前应该保持为空,但为什么在范围内它是空的呢

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


非常感谢您的帮助。

它如您所愿工作,代码中唯一缺少的是
会话
作为参数传递给
查找
方法,请尝试:

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

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

Mongo驱动程序是否可能缓存
InsertOne
,而不将其提交到磁盘,但读取操作会在写入数据之前尝试从磁盘获取数据?如果将
Find
延迟一两秒钟,会发生什么情况?我已经有一段时间没有接触MongoDB了。延迟操作不会影响最终结果mickl在下面指出,您需要将会话对象传递到每个操作中,这很容易错过。如果您不想这样做,JohnKnoop.MongoRepository提供了一个自动登记当前事务的抽象:我们有办法读取事务之外的未提交文档吗?