直到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上重现相同的场景,在事务范围内插入后查询表,然后在提交之前返回数据。
感谢您的帮助。
答案 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();