Transações
Explica a transação do MongoDB ClientSession do getTxJob, a propagação de sessão do Reactor Context, a responsabilidade de retry e as fronteiras da transação do Spring.
getTxJob
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(...) abre uma ClientSession com MongoExecutionContext.startSession(), inicia a transação e insere o binding da sessão no Contexto Reactor. Em caso de conclusão normal, faz commit; em caso de erro/cancelamento, aborta a transação ativa; e, por fim, fecha a sessão.
Escopo da sessão
A sessão de transação é propagada apenas para a mesma execução DSL com MongoExecutionContext#getSessionScope(). O DriverMongoExecutionContext padrão usa seu próprio MongoClient como escopo de sessão.
A responsabilidade pela repetição da transação é do chamador.
getTxJob(...) não tenta automaticamente repetir erros de transação do MongoDB, como TransientTransactionError. A decisão sobre a repetição e o número de tentativas é feita pela aplicação chamadora, que conhece a idempotência da operação, efeitos colaterais externos e regras de negócios.
Limite com transações Spring.
Spring @Transactional / TransactionalOperator.
Limite de transação/sessão gerenciado pelo Spring Data MongoDB.
ReactiveMongoDsl#getTxJob.
O DSL inicia diretamente o ClientSession e o passa para o Contexto Reactor.