Я пытаюсь протестировать вновь поддерживаемые транзакции в БД 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" });
С этими двумя изменениями транзакция теперь работает.