>

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

    문서에서.

    와이즈 비즈

    여러 세션의 작업이 잦은 차단없이 병렬로 진행될 수 있음을 의미합니다.

    Isolation

    Operations within a causally consistent session are not isolated from operations outside the session. If a concurrent write operation interleaves between the session’s write and read operations, the session’s read operation may return results that reflect a write operation that occurred after the session’s write operation.

  • 이전 nvd3.js - 각도 2의 nvd3 차트 문제 원하는대로 y 축 값을 표시 할 수 없습니다
  • 다음 java - WebFlux에서 필터로 발신 요청에 헤더 추가