Search in sources :

Example 6 with TransactionException

use of cn.taketoday.transaction.TransactionException in project today-infrastructure by TAKETODAY.

the class AbstractReactiveTransactionManager method processCommit.

/**
 * Process an actual commit.
 * Rollback-only flags have already been checked and applied.
 *
 * @param synchronizationManager the synchronization manager bound to the current transaction
 * @param status object representing the transaction
 * @throws TransactionException in case of commit failure
 */
private Mono<Void> processCommit(TransactionSynchronizationManager synchronizationManager, GenericReactiveTransaction status) throws TransactionException {
    AtomicBoolean beforeCompletionInvoked = new AtomicBoolean();
    Mono<Object> commit = prepareForCommit(synchronizationManager, status).then(triggerBeforeCommit(synchronizationManager, status)).then(triggerBeforeCompletion(synchronizationManager, status)).then(Mono.defer(() -> {
        beforeCompletionInvoked.set(true);
        if (status.isNewTransaction()) {
            if (status.isDebug()) {
                logger.debug("Initiating transaction commit");
            }
            return doCommit(synchronizationManager, status);
        }
        return Mono.empty();
    })).then(Mono.empty().onErrorResume(ex -> {
        Mono<Object> propagateException = Mono.error(ex);
        // Store result in a local variable in order to appease the
        // Eclipse compiler with regard to inferred generics.
        Mono<Object> result = propagateException;
        if (ErrorPredicates.UNEXPECTED_ROLLBACK.test(ex)) {
            result = triggerAfterCompletion(synchronizationManager, status, TransactionSynchronization.STATUS_ROLLED_BACK).then(propagateException);
        } else if (ErrorPredicates.TRANSACTION_EXCEPTION.test(ex)) {
            result = triggerAfterCompletion(synchronizationManager, status, TransactionSynchronization.STATUS_UNKNOWN).then(propagateException);
        } else if (ErrorPredicates.RUNTIME_OR_ERROR.test(ex)) {
            Mono<Void> mono;
            if (!beforeCompletionInvoked.get()) {
                mono = triggerBeforeCompletion(synchronizationManager, status);
            } else {
                mono = Mono.empty();
            }
            result = mono.then(doRollbackOnCommitException(synchronizationManager, status, ex)).then(propagateException);
        }
        return result;
    })).then(Mono.defer(() -> triggerAfterCommit(synchronizationManager, status).onErrorResume(ex -> triggerAfterCompletion(synchronizationManager, status, TransactionSynchronization.STATUS_COMMITTED).then(Mono.error(ex))).then(triggerAfterCompletion(synchronizationManager, status, TransactionSynchronization.STATUS_COMMITTED))));
    return commit.onErrorResume(ex -> cleanupAfterCompletion(synchronizationManager, status).then(Mono.error(ex))).then(cleanupAfterCompletion(synchronizationManager, status));
}
Also used : Serial(java.io.Serial) ReactiveTransaction(cn.taketoday.transaction.ReactiveTransaction) TransactionDefinition(cn.taketoday.transaction.TransactionDefinition) InvalidTimeoutException(cn.taketoday.transaction.InvalidTimeoutException) Predicate(java.util.function.Predicate) ObjectInputStream(java.io.ObjectInputStream) ReactiveTransactionManager(cn.taketoday.transaction.ReactiveTransactionManager) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) IOException(java.io.IOException) Mono(reactor.core.publisher.Mono) TransactionSuspensionNotSupportedException(cn.taketoday.transaction.TransactionSuspensionNotSupportedException) Serializable(java.io.Serializable) LoggerFactory(cn.taketoday.logging.LoggerFactory) Flux(reactor.core.publisher.Flux) List(java.util.List) Nullable(cn.taketoday.lang.Nullable) IllegalTransactionStateException(cn.taketoday.transaction.IllegalTransactionStateException) TransactionException(cn.taketoday.transaction.TransactionException) UnexpectedRollbackException(cn.taketoday.transaction.UnexpectedRollbackException) Logger(cn.taketoday.logging.Logger) Optional(java.util.Optional) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean)

Aggregations

TransactionDefinition (cn.taketoday.transaction.TransactionDefinition)6 TransactionException (cn.taketoday.transaction.TransactionException)6 Nullable (cn.taketoday.lang.Nullable)4 Logger (cn.taketoday.logging.Logger)4 LoggerFactory (cn.taketoday.logging.LoggerFactory)4 IllegalTransactionStateException (cn.taketoday.transaction.IllegalTransactionStateException)4 InvalidTimeoutException (cn.taketoday.transaction.InvalidTimeoutException)4 ReactiveTransaction (cn.taketoday.transaction.ReactiveTransaction)4 ReactiveTransactionManager (cn.taketoday.transaction.ReactiveTransactionManager)4 TransactionSuspensionNotSupportedException (cn.taketoday.transaction.TransactionSuspensionNotSupportedException)4 UnexpectedRollbackException (cn.taketoday.transaction.UnexpectedRollbackException)4 IOException (java.io.IOException)4 ObjectInputStream (java.io.ObjectInputStream)4 Serial (java.io.Serial)4 Serializable (java.io.Serializable)4 List (java.util.List)4 Optional (java.util.Optional)4 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)4 Predicate (java.util.function.Predicate)4 Flux (reactor.core.publisher.Flux)4