为什么在MongoDB中许多会话比一个会话快?

时间:2019-05-04 07:21:05

标签: c# mongodb performance mongodb-.net-driver

要在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 个答案:

答案 0 :(得分:2)

来自the documentation

  

隔离

     

因果一致会话中的操作并非与   会话外的操作。如果是并发写操作   在会话的读写操作之间进行交错,   会话的读取操作可能会返回反映写入的结果   在会话的写操作之后发生的操作。

这意味着不同会话的操作可以并行进行而不会频繁阻塞。