MongoDB многодокументная транзакция, чтение не зафиксированных данных - PullRequest
0 голосов
/ 08 ноября 2018

До 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 с использованием той же логики, запрос таблицы после вставки в область транзакции возвращает данные перед фиксацией.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 10 ноября 2018

Это работает так, как вы ожидали, единственное, чего вам не хватает в вашем коде, - это session, переданного в качестве аргумента методу Find, попробуйте:

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

session.CommitTransaction();
...