Skip to content

Commit

Permalink
Document target method expectations for ReactiveTransactionManager
Browse files Browse the repository at this point in the history
Closes gh-23277
  • Loading branch information
jhoeller committed Dec 27, 2023
1 parent a338a16 commit a155a6b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ within the method.
A reactive transaction managed by `ReactiveTransactionManager` uses the Reactor context
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.
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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@
* all participating data access operations need to execute within the same
* 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 Juergen Hoeller
* @author Sam Brannen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,8 +358,8 @@ protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targe
(isSuspendingFunction ? (hasSuspendingFlowReturnType ? Flux.class : Mono.class) : method.getReturnType());
ReactiveAdapter adapter = this.reactiveAdapterRegistry.getAdapter(reactiveType);
if (adapter == null) {
throw new IllegalStateException("Cannot apply reactive transaction to non-reactive return type: " +
method.getReturnType());
throw new IllegalStateException("Cannot apply reactive transaction to non-reactive return type [" +
method.getReturnType() + "] with specified transaction manager: " + tm);
}
return new ReactiveTransactionSupport(adapter);
});
Expand Down

0 comments on commit a155a6b

Please sign in to comment.