MongoDB 多文档事务,读取未提交的数据
MongoDB multi document transaction, reading non commited data
在 MongoDB v4.0
之前,多文档事务是通过实施两阶段提交实现的。
在4.0
、MongoDB之后引入了副本集的多文档事务;根据他们的文档; "until a transaction is committed, no write/update operations in the transaction are visible outside the transaction"。
但是数据在事务范围内的可见性呢?
为了简单起见,我已经实现了下面的例子,描述了这个案例。
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 服务器上重现相同的场景,使用相同的逻辑,在事务范围内插入后查询 table,提交前 returns 数据。
感谢任何帮助。
它按您预期的那样工作,您的代码中唯一缺少的是 session
作为参数传递给 Find
方法,试试:
session.StartTransaction();
ColA.InsertOne(session, BsonDocument.Parse(Obj.ToString()));
var tt = ColA.Find(session, Builders<BsonDocument>.Filter.Empty).ToList();
session.CommitTransaction();
在 MongoDB v4.0
之前,多文档事务是通过实施两阶段提交实现的。
在4.0
、MongoDB之后引入了副本集的多文档事务;根据他们的文档; "until a transaction is committed, no write/update operations in the transaction are visible outside the transaction"。
但是数据在事务范围内的可见性呢?
为了简单起见,我已经实现了下面的例子,描述了这个案例。
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 服务器上重现相同的场景,使用相同的逻辑,在事务范围内插入后查询 table,提交前 returns 数据。
感谢任何帮助。
它按您预期的那样工作,您的代码中唯一缺少的是 session
作为参数传递给 Find
方法,试试:
session.StartTransaction();
ColA.InsertOne(session, BsonDocument.Parse(Obj.ToString()));
var tt = ColA.Find(session, Builders<BsonDocument>.Filter.Empty).ToList();
session.CommitTransaction();