Search in sources :

Example 1 with InvalidTimeoutException

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

the class AbstractReactiveTransactionManager method getReactiveTransaction.

// ---------------------------------------------------------------------
// Implementation of ReactiveTransactionManager
// ---------------------------------------------------------------------
/**
 * This implementation handles propagation behavior. Delegates to
 * {@code doGetTransaction}, {@code isExistingTransaction}
 * and {@code doBegin}.
 *
 * @see #doGetTransaction
 * @see #isExistingTransaction
 * @see #doBegin
 */
@Override
public final Mono<ReactiveTransaction> getReactiveTransaction(@Nullable TransactionDefinition definition) throws TransactionException {
    // Use defaults if no transaction definition given.
    TransactionDefinition def = (definition != null ? definition : TransactionDefinition.withDefaults());
    return TransactionSynchronizationManager.forCurrentTransaction().flatMap(synchronizationManager -> {
        Object transaction = doGetTransaction(synchronizationManager);
        // Cache debug flag to avoid repeated checks.
        boolean debugEnabled = logger.isDebugEnabled();
        if (isExistingTransaction(transaction)) {
            // Existing transaction found -> check propagation behavior to find out how to behave.
            return handleExistingTransaction(synchronizationManager, def, transaction, debugEnabled);
        }
        // Check definition settings for new transaction.
        if (def.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
            return Mono.error(new InvalidTimeoutException("Invalid transaction timeout", def.getTimeout()));
        }
        // No existing transaction found -> check propagation behavior to find out how to proceed.
        if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
            return Mono.error(new IllegalTransactionStateException("No existing transaction found for transaction marked with propagation 'mandatory'"));
        } else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
            return TransactionContextManager.currentContext().map(TransactionSynchronizationManager::new).flatMap(nestedSynchronizationManager -> suspend(nestedSynchronizationManager, null).map(Optional::of).defaultIfEmpty(Optional.empty()).flatMap(suspendedResources -> {
                if (debugEnabled) {
                    logger.debug("Creating new transaction with name [" + def.getName() + "]: " + def);
                }
                return Mono.defer(() -> {
                    GenericReactiveTransaction status = newReactiveTransaction(nestedSynchronizationManager, def, transaction, true, debugEnabled, suspendedResources.orElse(null));
                    return doBegin(nestedSynchronizationManager, transaction, def).doOnSuccess(ignore -> prepareSynchronization(nestedSynchronizationManager, status, def)).thenReturn(status);
                }).onErrorResume(ErrorPredicates.RUNTIME_OR_ERROR, ex -> resume(nestedSynchronizationManager, null, suspendedResources.orElse(null)).then(Mono.error(ex)));
            }));
        } else {
            // Create "empty" transaction: no actual transaction, but potentially synchronization.
            if (def.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) {
                logger.warn("Custom isolation level specified but no actual transaction initiated; " + "isolation level will effectively be ignored: " + def);
            }
            return Mono.just(prepareReactiveTransaction(synchronizationManager, def, null, true, debugEnabled, null));
        }
    });
}
Also used : TransactionDefinition(cn.taketoday.transaction.TransactionDefinition) 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) InvalidTimeoutException(cn.taketoday.transaction.InvalidTimeoutException) Optional(java.util.Optional) IllegalTransactionStateException(cn.taketoday.transaction.IllegalTransactionStateException)

Example 2 with InvalidTimeoutException

use of cn.taketoday.transaction.InvalidTimeoutException in project today-framework by TAKETODAY.

the class AbstractReactiveTransactionManager method getReactiveTransaction.

// ---------------------------------------------------------------------
// Implementation of ReactiveTransactionManager
// ---------------------------------------------------------------------
/**
 * This implementation handles propagation behavior. Delegates to
 * {@code doGetTransaction}, {@code isExistingTransaction}
 * and {@code doBegin}.
 *
 * @see #doGetTransaction
 * @see #isExistingTransaction
 * @see #doBegin
 */
@Override
public final Mono<ReactiveTransaction> getReactiveTransaction(@Nullable TransactionDefinition definition) throws TransactionException {
    // Use defaults if no transaction definition given.
    TransactionDefinition def = (definition != null ? definition : TransactionDefinition.withDefaults());
    return TransactionSynchronizationManager.forCurrentTransaction().flatMap(synchronizationManager -> {
        Object transaction = doGetTransaction(synchronizationManager);
        // Cache debug flag to avoid repeated checks.
        boolean debugEnabled = logger.isDebugEnabled();
        if (isExistingTransaction(transaction)) {
            // Existing transaction found -> check propagation behavior to find out how to behave.
            return handleExistingTransaction(synchronizationManager, def, transaction, debugEnabled);
        }
        // Check definition settings for new transaction.
        if (def.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
            return Mono.error(new InvalidTimeoutException("Invalid transaction timeout", def.getTimeout()));
        }
        // No existing transaction found -> check propagation behavior to find out how to proceed.
        if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
            return Mono.error(new IllegalTransactionStateException("No existing transaction found for transaction marked with propagation 'mandatory'"));
        } else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
            return TransactionContextManager.currentContext().map(TransactionSynchronizationManager::new).flatMap(nestedSynchronizationManager -> suspend(nestedSynchronizationManager, null).map(Optional::of).defaultIfEmpty(Optional.empty()).flatMap(suspendedResources -> {
                if (debugEnabled) {
                    logger.debug("Creating new transaction with name [" + def.getName() + "]: " + def);
                }
                return Mono.defer(() -> {
                    GenericReactiveTransaction status = newReactiveTransaction(nestedSynchronizationManager, def, transaction, true, debugEnabled, suspendedResources.orElse(null));
                    return doBegin(nestedSynchronizationManager, transaction, def).doOnSuccess(ignore -> prepareSynchronization(nestedSynchronizationManager, status, def)).thenReturn(status);
                }).onErrorResume(ErrorPredicates.RUNTIME_OR_ERROR, ex -> resume(nestedSynchronizationManager, null, suspendedResources.orElse(null)).then(Mono.error(ex)));
            }));
        } else {
            // Create "empty" transaction: no actual transaction, but potentially synchronization.
            if (def.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT && logger.isWarnEnabled()) {
                logger.warn("Custom isolation level specified but no actual transaction initiated; " + "isolation level will effectively be ignored: " + def);
            }
            return Mono.just(prepareReactiveTransaction(synchronizationManager, def, null, true, debugEnabled, null));
        }
    });
}
Also used : TransactionDefinition(cn.taketoday.transaction.TransactionDefinition) 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) InvalidTimeoutException(cn.taketoday.transaction.InvalidTimeoutException) Optional(java.util.Optional) IllegalTransactionStateException(cn.taketoday.transaction.IllegalTransactionStateException)

Aggregations

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