Mongo DB с C # - документ добавляется независимо от транзакции - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь протестировать вновь поддерживаемые транзакции в БД Mongo на простом примере, который я написал.Я использую Mongo DB версии 4.0.5 с драйвером версии 2.8.1.Это только основной экземпляр без осколков / реплик.

Мне не хватает чего-то простого в следующем коде.Я создаю клиент Mongo, сессию и базу данных, затем запускаю транзакцию, добавляю документ и отменяю транзакцию.После этого кода я не ожидаю ничего изменить в базе данных, но документ добавлен.При отладке я также вижу документ сразу после InsertOne() с помощью Robo 3T (графический клиент Mongo).

Есть идеи, что мне не хватает?

        var client =  new MongoClient("mongodb://localhost:27017");
        var session = client.StartSession();
        var database = session.Client.GetDatabase("myDatabase", new MongoDatabaseSettings
        {
            GuidRepresentation = GuidRepresentation.Standard,
            ReadPreference = ReadPreference.Primary,
            WriteConcern = new WriteConcern(1, 
                new MongoDB.Driver.Optional<TimeSpan?>(TimeSpan.FromSeconds(30))),

        });

        var entities = database.GetCollection<MyEntity>("test");            

        session.StartTransaction();

        // After this line I can already see the document in the db collection using Mongo client GUI (Robo 3T), although I expect not to see it until committing
        entities.InsertOne(new MyEntity { Name =  "Entity" });

        // This does not have any effect
        session.AbortTransaction();

Редактировать:

Возможно запустить MongoDB как набор реплик с 1 узлом, хотя я не уверен, в чем разница между автономным набором реплик и 1 узлом.См. Мой пост ниже.

В любом случае, чтобы использовать запущенную транзакцию, код вставки должен получить сеанс в качестве параметра:

entities.InsertOne(session, new MyEntity { Name = "Entity" });

С этими двумя изменениями транзакция теперь работает.

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Это по сути свойство самого MongoDB. (Подробнее здесь и здесь )

Транзакции доступны только в настройках набора реплик

Почему он недоступен для автономных экземпляров?

С поддокументами и массивами базы данных документов (MongoDB) позволяют иерархически объединять связанные данные в единой структуре данных. Документ может быть обновлен с помощью атомарной операции, предоставляя ему те же гарантии целостности данных, что и многотабличные транзакции в реляционной базе данных.

0 голосов
/ 27 мая 2019

Я нашел решение, хотя не уверен, каковы последствия, может быть, кто-то может указать на это: Кажется, можно использовать Mongo DB в качестве набора реплик из 1 узла (вместо отдельного), просто добавив в файл mongod.cfg следующее:

replication:
   replSetName: rs1

Кроме того, благодаря следующей ссылке код должен использовать корректную перегрузку InsertOne(), которая получает сеанс в качестве первого параметра (см. Редактирование в исходном сообщении):

транзакция с несколькими документами не работает в c # с использованием сервера сообщества mongodb 4.08

...