Почему многие сессии быстрее в MongoDB, чем одна? - PullRequest
10 голосов
/ 04 мая 2019

Чтобы использовать транзакции в MongoDB, вы должны сначала начать сеанс.Когда у вас много транзакций, вы можете либо повторно использовать существующий сеанс, либо создать новый для каждой транзакции.

Я провел сравнительный анализ (код ниже) обоих вариантов, и результат меня озадачивает.Использование нового сеанса для каждой транзакции кажется значительно быстрее (в 2-3 раза быстрее), чем использование одного сеанса для всех транзакций.

Кто-нибудь может объяснить, почему это так?Как работают сессии под капотом?Каковы их последствия?Какие затраты подразумевают (и когда и почему)?Я действительно хочу понять, и я благодарен за любые указатели.

Stopwatch sw = new Stopwatch();

coll1.InsertOne(new BsonDocument { { "Seq", 0 } });
sw.Start();
for (int i = 1; i <= reps; i++) {
    using (var session = client.StartSession()) {
        session.StartTransaction();
        coll1.InsertOne(session: session, document: new BsonDocument { { "Seq", i } });
        session.CommitTransaction();
    }
}
sw.Stop();
Console.WriteLine($"{reps / sw.Elapsed.TotalSeconds} OP/s with fresh sessions.");

coll2.InsertOne(new BsonDocument { { "Seq", 0 } });
sw.Restart();
using (var session = client.StartSession()) {
    for (int i = 1; i <= reps; i++) {
        session.StartTransaction();
        coll2.InsertOne(session: session, document: new BsonDocument { { "Seq", i } });
        session.CommitTransaction();
    }
}
sw.Stop();
Console.WriteLine($"{reps / sw.Elapsed.TotalSeconds} OP/s with common session.");

Я также попытался сначала запустить односессионный код, давая мне тот же результат.

1 Ответ

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

С документация .

Изоляция

Операции внутри причинно-согласованного сеанса не изолированы от операций вне сеанса.Если параллельная операция записи перемежается между операциями записи и чтения сеанса, операция чтения сеанса может возвращать результаты, которые отражают операцию записи, которая произошла после операции записи сеанса.

Это означает, что операции различных сеансовможет идти параллельно без частой блокировки.

...