Transactions

getTxJobのMongoDB ClientSessionトランザクション、Reactorコンテキストセッション伝播、リトライ責任とSpringトランザクション境界を説明します。


getTxJob

java
Mono<String> result = dsl.getTxJob(
    MongoTemplateName.FRONT,
    () -> dsl
        .executeEntity(User.class, MongoTemplateName.FRONT)
        .save(user)
        .then(
            dsl.executeEntity(Audit.class, MongoTemplateName.FRONT)
                .save(audit)
        )
        .thenReturn("committed")
);

getTxJob(...)はMongoExecutionContext.startSession()でClientSessionを開き、トランザクションを開始した後、Reactorコンテキストにセッションバインディングを入れます。正常に完了した場合はコミット、エラー/キャンセル時はアクティブトランザクションを中止し、最後にセッションをクローズする順序で処理します。

セッションスコープ

トランザクションセッションはMongoExecutionContext#getSessionScope()が同じDSL実行にのみ伝播されます。基本のDriverMongoExecutionContextは自身のMongoClientをセッションスコープとして使用します。

トランザクションの再試行は呼び出し側の責任です。

getTxJob(...) は TransientTransactionError のような MongoDB トランザクションエラーを自動的に再試行しません。再試行の有無と回数は、操作の冪等性、外部の副作用、業務ルールを知っている呼び出しアプリケーションが決定します。

Spring トランザクションとの境界

Spring @Transactional / TransactionalOperator

Spring Data MongoDB が管理するトランザクション/セッションの境界です。

ReactiveMongoDsl#getTxJob

DSL が直接 ClientSession を開始し、Reactor コンテキストに渡します。

© 2026 Byeolnaerim. 無断転載を禁じます。紹介プライバシーポリシー