Transaktionen
Erklärt die MongoDB ClientSession-Transaktion von getTxJob, die Sitzungsweitergabe im Reactor-Kontext, die Verantwortung für Wiederholungen und die Grenzen der Spring-Transaktion.
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(...) öffnet die ClientSession mit MongoExecutionContext.startSession(), startet die Transaktion und bindet die Sitzung an den Reactor-Kontext. Bei erfolgreichem Abschluss wird ein Commit durchgeführt, bei Fehlern/Abbrüchen wird die aktive Transaktion abgebrochen, und am Ende wird die Sitzung geschlossen.
Sitzungsbereich
Die Transaktionssitzung wird nur an die gleiche DSL-Ausführung von MongoExecutionContext#getSessionScope() weitergegeben. Der Standard DriverMongoExecutionContext verwendet seinen eigenen MongoClient als Sitzungsbereich.
Die Verantwortung für das Transaktions-Retry liegt beim Aufrufer.
getTxJob(...) führt kein automatisches Retry bei MongoDB-Transaktionsfehlern wie TransientTransactionError durch. Ob und wie oft ein Retry erfolgt, wird von der Idempotenz der Operation, externen Nebeneffekten und den Geschäftsregeln der aufrufenden Anwendung entschieden.
Grenzen zu Spring-Transaktionen
Spring @Transactional / TransactionalOperator
Grenzen der Transaktionen/Sitzungen, die von Spring Data MongoDB verwaltet werden.
ReactiveMongoDsl#getTxJob
DSL startet direkt ClientSession und übergibt es an den Reactor Context.