Skip to content

Commit

Permalink
Fix suspend/resume in AbstractReactiveTransactionManager
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mp911de authored and jhoeller committed May 7, 2019
1 parent 55b56b8 commit bb002af
Showing 1 changed file with 6 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ private Mono<ReactiveTransaction> handleExistingTransaction(TransactionSynchroni
Mono<SuspendedResourcesHolder> suspendedResources = suspend(synchronizationManager, transaction);
return suspendedResources.flatMap(suspendedResourcesHolder -> {
GenericReactiveTransaction status = newReactiveTransaction(synchronizationManager,
definition, transaction, true, debugEnabled, suspendedResources);
definition, transaction, true, debugEnabled, suspendedResourcesHolder);
return doBegin(synchronizationManager, transaction, definition).doOnSuccess(ignore ->
prepareSynchronization(synchronizationManager, status, definition)).thenReturn(status)
.onErrorResume(ErrorPredicates.RUNTIME_OR_ERROR, beginEx ->
Expand Down Expand Up @@ -322,22 +322,24 @@ private Mono<Void> resume(TransactionSynchronizationManager synchronizationManag
@Nullable Object transaction, @Nullable SuspendedResourcesHolder resourcesHolder)
throws TransactionException {

Mono<Void> resume = Mono.empty();

if (resourcesHolder != null) {
Object suspendedResources = resourcesHolder.suspendedResources;
if (suspendedResources != null) {
return doResume(synchronizationManager, transaction, suspendedResources);
resume = doResume(synchronizationManager, transaction, suspendedResources);
}
List<TransactionSynchronization> suspendedSynchronizations = resourcesHolder.suspendedSynchronizations;
if (suspendedSynchronizations != null) {
synchronizationManager.setActualTransactionActive(resourcesHolder.wasActive);
synchronizationManager.setCurrentTransactionIsolationLevel(resourcesHolder.isolationLevel);
synchronizationManager.setCurrentTransactionReadOnly(resourcesHolder.readOnly);
synchronizationManager.setCurrentTransactionName(resourcesHolder.name);
return doResumeSynchronization(synchronizationManager, suspendedSynchronizations);
return resume.then(doResumeSynchronization(synchronizationManager, suspendedSynchronizations));
}
}

return Mono.empty();
return resume;
}

/**
Expand Down

0 comments on commit bb002af

Please sign in to comment.