001/*
002 * Copyright 2002-2019 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      https://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.transaction.annotation;
018
019import org.springframework.transaction.TransactionDefinition;
020
021/**
022 * Enumeration that represents transaction propagation behaviors for use
023 * with the {@link Transactional} annotation, corresponding to the
024 * {@link TransactionDefinition} interface.
025 *
026 * @author Colin Sampaleanu
027 * @author Juergen Hoeller
028 * @since 1.2
029 */
030public enum Propagation {
031
032        /**
033         * Support a current transaction, create a new one if none exists.
034         * Analogous to EJB transaction attribute of the same name.
035         * <p>This is the default setting of a transaction annotation.
036         */
037        REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
038
039        /**
040         * Support a current transaction, execute non-transactionally if none exists.
041         * Analogous to EJB transaction attribute of the same name.
042         * <p>Note: For transaction managers with transaction synchronization,
043         * {@code SUPPORTS} is slightly different from no transaction at all,
044         * as it defines a transaction scope that synchronization will apply for.
045         * As a consequence, the same resources (JDBC Connection, Hibernate Session, etc)
046         * will be shared for the entire specified scope. Note that this depends on
047         * the actual synchronization configuration of the transaction manager.
048         * @see org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization
049         */
050        SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
051
052        /**
053         * Support a current transaction, throw an exception if none exists.
054         * Analogous to EJB transaction attribute of the same name.
055         */
056        MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
057
058        /**
059         * Create a new transaction, and suspend the current transaction if one exists.
060         * Analogous to the EJB transaction attribute of the same name.
061         * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box
062         * on all transaction managers. This in particular applies to
063         * {@link org.springframework.transaction.jta.JtaTransactionManager},
064         * which requires the {@code javax.transaction.TransactionManager} to be
065         * made available to it (which is server-specific in standard Java EE).
066         * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
067         */
068        REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
069
070        /**
071         * Execute non-transactionally, suspend the current transaction if one exists.
072         * Analogous to EJB transaction attribute of the same name.
073         * <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box
074         * on all transaction managers. This in particular applies to
075         * {@link org.springframework.transaction.jta.JtaTransactionManager},
076         * which requires the {@code javax.transaction.TransactionManager} to be
077         * made available to it (which is server-specific in standard Java EE).
078         * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
079         */
080        NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
081
082        /**
083         * Execute non-transactionally, throw an exception if a transaction exists.
084         * Analogous to EJB transaction attribute of the same name.
085         */
086        NEVER(TransactionDefinition.PROPAGATION_NEVER),
087
088        /**
089         * Execute within a nested transaction if a current transaction exists,
090         * behave like {@code REQUIRED} otherwise. There is no analogous feature in EJB.
091         * <p>Note: Actual creation of a nested transaction will only work on specific
092         * transaction managers. Out of the box, this only applies to the JDBC
093         * DataSourceTransactionManager. Some JTA providers might support nested
094         * transactions as well.
095         * @see org.springframework.jdbc.datasource.DataSourceTransactionManager
096         */
097        NESTED(TransactionDefinition.PROPAGATION_NESTED);
098
099
100        private final int value;
101
102
103        Propagation(int value) {
104                this.value = value;
105        }
106
107        public int value() {
108                return this.value;
109        }
110
111}