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}