在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服务器上复制相同的场景,使用相同的逻辑,在事务范围内插入之后查询表,在提交之前返回数据。
任何帮助都是非常感谢的。
发布于 2018-11-09 21:15:10
正如您所预期的那样,您在代码中缺少的唯一功能是将session作为参数传递给Find方法,尝试:
session.StartTransaction();
ColA.InsertOne(session, BsonDocument.Parse(Obj.ToString()));
var tt = ColA.Find(session, Builders<BsonDocument>.Filter.Empty).ToList();
session.CommitTransaction();https://stackoverflow.com/questions/53208132
复制相似问题