Document target method expectations for ReactiveTransactionManager

Closes gh-23277
This commit is contained in:
Juergen Hoeller 2023-12-27 23:48:55 +01:00
parent a338a16b29
commit a155a6b3e2
3 changed files with 12 additions and 2 deletions

View File

@ -38,6 +38,11 @@ within the method.
A reactive transaction managed by `ReactiveTransactionManager` uses the Reactor context A reactive transaction managed by `ReactiveTransactionManager` uses the Reactor context
instead of thread-local attributes. As a consequence, all participating data access instead of thread-local attributes. As a consequence, all participating data access
operations need to execute within the same Reactor context in the same reactive pipeline. operations need to execute within the same Reactor context in the same reactive pipeline.
When configured with a `ReactiveTransactionManager`, all transaction-demarcated methods
are expected to return a reactive pipeline. Void methods or regular return types need
to be associated with a regular `PlatformTransactionManager`, e.g. through the
`transactionManager` attribute of the corresponding `@Transactional` declarations.
==== ====
The following image shows a conceptual view of calling a method on a transactional proxy: The following image shows a conceptual view of calling a method on a transactional proxy:

View File

@ -105,6 +105,11 @@ import org.springframework.transaction.TransactionDefinition;
* all participating data access operations need to execute within the same * all participating data access operations need to execute within the same
* Reactor context in the same reactive pipeline. * Reactor context in the same reactive pipeline.
* *
* <p><b>Note: When configured with a {@code ReactiveTransactionManager}, all
* transaction-demarcated methods are expected to return a reactive pipeline.</b>
* Void methods or regular return types need to be associated with a regular
* {@code PlatformTransactionManager}, e.g. through {@link #transactionManager()}.
*
* @author Colin Sampaleanu * @author Colin Sampaleanu
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Sam Brannen * @author Sam Brannen

View File

@ -358,8 +358,8 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init
(isSuspendingFunction ? (hasSuspendingFlowReturnType ? Flux.class : Mono.class) : method.getReturnType()); (isSuspendingFunction ? (hasSuspendingFlowReturnType ? Flux.class : Mono.class) : method.getReturnType());
ReactiveAdapter adapter = this.reactiveAdapterRegistry.getAdapter(reactiveType); ReactiveAdapter adapter = this.reactiveAdapterRegistry.getAdapter(reactiveType);
if (adapter == null) { if (adapter == null) {
throw new IllegalStateException("Cannot apply reactive transaction to non-reactive return type: " + throw new IllegalStateException("Cannot apply reactive transaction to non-reactive return type [" +
method.getReturnType()); method.getReturnType() + "] with specified transaction manager: " + tm);
} }
return new ReactiveTransactionSupport(adapter); return new ReactiveTransactionSupport(adapter);
}); });