Skip to content

Commit bb002af

Browse files
mp911dejhoeller
authored andcommitted
Fix suspend/resume in AbstractReactiveTransactionManager
We now correctly unwrap suspended resources instead capturing the Mono emitting suspended resources. We also properly continue resume by chaining resume Mono's instead of terminating eagerly.
1 parent 55b56b8 commit bb002af

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

spring-tx/src/main/java/org/springframework/transaction/reactive/AbstractReactiveTransactionManager.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ private Mono<ReactiveTransaction> handleExistingTransaction(TransactionSynchroni
192192
Mono<SuspendedResourcesHolder> suspendedResources = suspend(synchronizationManager, transaction);
193193
return suspendedResources.flatMap(suspendedResourcesHolder -> {
194194
GenericReactiveTransaction status = newReactiveTransaction(synchronizationManager,
195-
definition, transaction, true, debugEnabled, suspendedResources);
195+
definition, transaction, true, debugEnabled, suspendedResourcesHolder);
196196
return doBegin(synchronizationManager, transaction, definition).doOnSuccess(ignore ->
197197
prepareSynchronization(synchronizationManager, status, definition)).thenReturn(status)
198198
.onErrorResume(ErrorPredicates.RUNTIME_OR_ERROR, beginEx ->
@@ -322,22 +322,24 @@ private Mono<Void> resume(TransactionSynchronizationManager synchronizationManag
322322
@Nullable Object transaction, @Nullable SuspendedResourcesHolder resourcesHolder)
323323
throws TransactionException {
324324

325+
Mono<Void> resume = Mono.empty();
326+
325327
if (resourcesHolder != null) {
326328
Object suspendedResources = resourcesHolder.suspendedResources;
327329
if (suspendedResources != null) {
328-
return doResume(synchronizationManager, transaction, suspendedResources);
330+
resume = doResume(synchronizationManager, transaction, suspendedResources);
329331
}
330332
List<TransactionSynchronization> suspendedSynchronizations = resourcesHolder.suspendedSynchronizations;
331333
if (suspendedSynchronizations != null) {
332334
synchronizationManager.setActualTransactionActive(resourcesHolder.wasActive);
333335
synchronizationManager.setCurrentTransactionIsolationLevel(resourcesHolder.isolationLevel);
334336
synchronizationManager.setCurrentTransactionReadOnly(resourcesHolder.readOnly);
335337
synchronizationManager.setCurrentTransactionName(resourcesHolder.name);
336-
return doResumeSynchronization(synchronizationManager, suspendedSynchronizations);
338+
return resume.then(doResumeSynchronization(synchronizationManager, suspendedSynchronizations));
337339
}
338340
}
339341

340-
return Mono.empty();
342+
return resume;
341343
}
342344

343345
/**

0 commit comments

Comments
 (0)