org.springframework.transaction

## Interface TransactionDefinition

- All Known Subinterfaces:
    TransactionAttribute
  All Known Implementing Classes:
    DefaultTransactionAttribute, DefaultTransactionDefinition, DelegatingTransactionAttribute, DelegatingTransactionDefinition, RuleBasedTransactionAttribute, TransactionTemplate

      public interface TransactionDefinition

  Interface that defines Spring-compliant transaction properties. Based on the propagation behavior definitions analogous to EJB CMT attributes.

  Note that isolation level and timeout settings will not get applied unless an actual new transaction gets started. As only `PROPAGATION_REQUIRED`, `PROPAGATION_REQUIRES_NEW` and `PROPAGATION_NESTED` can cause that, it usually doesn't make sense to specify those settings in other cases. Furthermore, be aware that not all transaction managers will support those advanced features and thus might throw corresponding exceptions when given non-default values.

  The `read-only flag` applies to any transaction context, whether backed by an actual resource transaction or operating non-transactionally at the resource level. In the latter case, the flag will only apply to managed resources within the application, such as a Hibernate `Session`.

  Since:
    08.05.2003
  Author:
    Juergen Hoeller
  See Also:
    `PlatformTransactionManager.getTransaction(TransactionDefinition)`, `DefaultTransactionDefinition`, `TransactionAttribute`

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static int` | `ISOLATION_DEFAULT` Use the default isolation level of the underlying datastore.
    `static int` | `ISOLATION_READ_COMMITTED` Indicates that dirty reads are prevented; non-repeatable reads and phantom reads can occur.
    `static int` | `ISOLATION_READ_UNCOMMITTED` Indicates that dirty reads, non-repeatable reads and phantom reads can occur.
    `static int` | `ISOLATION_REPEATABLE_READ` Indicates that dirty reads and non-repeatable reads are prevented; phantom reads can occur.
    `static int` | `ISOLATION_SERIALIZABLE` Indicates that dirty reads, non-repeatable reads and phantom reads are prevented.
    `static int` | `PROPAGATION_MANDATORY` Support a current transaction; throw an exception if no current transaction exists.
    `static int` | `PROPAGATION_NESTED` Execute within a nested transaction if a current transaction exists, behave like `PROPAGATION_REQUIRED` else.
    `static int` | `PROPAGATION_NEVER` Do not support a current transaction; throw an exception if a current transaction exists.
    `static int` | `PROPAGATION_NOT_SUPPORTED` Do not support a current transaction; rather always execute non-transactionally.
    `static int` | `PROPAGATION_REQUIRED` Support a current transaction; create a new one if none exists.
    `static int` | `PROPAGATION_REQUIRES_NEW` Create a new transaction, suspending the current transaction if one exists.
    `static int` | `PROPAGATION_SUPPORTS` Support a current transaction; execute non-transactionally if none exists.
    `static int` | `TIMEOUT_DEFAULT` Use the default timeout of the underlying transaction system, or none if timeouts are not supported.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `int` | `getIsolationLevel()` Return the isolation level.
    `String` | `getName()` Return the name of this transaction.
    `int` | `getPropagationBehavior()` Return the propagation behavior.
    `int` | `getTimeout()` Return the transaction timeout.
    `boolean` | `isReadOnly()` Return whether to optimize as a read-only transaction.

- - ### Field Detail

    - #### PROPAGATION_REQUIRED

          static final int PROPAGATION_REQUIRED

      Support a current transaction; create a new one if none exists. Analogous to the EJB transaction attribute of the same name.

      This is typically the default setting of a transaction definition, and typically defines a transaction synchronization scope.

      See Also:
        Constant Field Values

    - #### PROPAGATION_SUPPORTS

          static final int PROPAGATION_SUPPORTS

      Support a current transaction; execute non-transactionally if none exists. Analogous to the EJB transaction attribute of the same name.

      NOTE: For transaction managers with transaction synchronization, `PROPAGATION_SUPPORTS` is slightly different from no transaction at all, as it defines a transaction scope that synchronization might apply to. As a consequence, the same resources (a JDBC `Connection`, a Hibernate `Session`, etc) will be shared for the entire specified scope. Note that the exact behavior depends on the actual synchronization configuration of the transaction manager!

      In general, use `PROPAGATION_SUPPORTS` with care! In particular, do not rely on `PROPAGATION_REQUIRED` or `PROPAGATION_REQUIRES_NEW` within a `PROPAGATION_SUPPORTS` scope (which may lead to synchronization conflicts at runtime). If such nesting is unavoidable, make sure to configure your transaction manager appropriately (typically switching to "synchronization on actual transaction").

      See Also:
        `AbstractPlatformTransactionManager.setTransactionSynchronization(int)`, `AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION`, Constant Field Values

    - #### PROPAGATION_MANDATORY

          static final int PROPAGATION_MANDATORY

      Support a current transaction; throw an exception if no current transaction exists. Analogous to the EJB transaction attribute of the same name.

      Note that transaction synchronization within a `PROPAGATION_MANDATORY` scope will always be driven by the surrounding transaction.

      See Also:
        Constant Field Values

    - #### PROPAGATION_REQUIRES_NEW

          static final int PROPAGATION_REQUIRES_NEW

      Create a new transaction, suspending the current transaction if one exists. Analogous to the EJB transaction attribute of the same name.

      NOTE: Actual transaction suspension will not work out-of-the-box on all transaction managers. This in particular applies to `JtaTransactionManager`, which requires the `javax.transaction.TransactionManager` to be made available it to it (which is server-specific in standard J2EE).

      A `PROPAGATION_REQUIRES_NEW` scope always defines its own transaction synchronizations. Existing synchronizations will be suspended and resumed appropriately.

      See Also:
        `JtaTransactionManager.setTransactionManager(javax.transaction.TransactionManager)`, Constant Field Values

    - #### PROPAGATION_NOT_SUPPORTED

          static final int PROPAGATION_NOT_SUPPORTED

      Do not support a current transaction; rather always execute non-transactionally. Analogous to the EJB transaction attribute of the same name.

      NOTE: Actual transaction suspension will not work out-of-the-box on all transaction managers. This in particular applies to `JtaTransactionManager`, which requires the `javax.transaction.TransactionManager` to be made available it to it (which is server-specific in standard J2EE).

      Note that transaction synchronization is not available within a `PROPAGATION_NOT_SUPPORTED` scope. Existing synchronizations will be suspended and resumed appropriately.

      See Also:
        `JtaTransactionManager.setTransactionManager(javax.transaction.TransactionManager)`, Constant Field Values

    - #### PROPAGATION_NEVER

          static final int PROPAGATION_NEVER

      Do not support a current transaction; throw an exception if a current transaction exists. Analogous to the EJB transaction attribute of the same name.

      Note that transaction synchronization is not available within a `PROPAGATION_NEVER` scope.

      See Also:
        Constant Field Values

    - #### PROPAGATION_NESTED

          static final int PROPAGATION_NESTED

      Execute within a nested transaction if a current transaction exists, behave like `PROPAGATION_REQUIRED` else. There is no analogous feature in EJB.

      NOTE: Actual creation of a nested transaction will only work on specific transaction managers. Out of the box, this only applies to the JDBC `DataSourceTransactionManager` when working on a JDBC 3.0 driver. Some JTA providers might support nested transactions as well.

      See Also:
        `DataSourceTransactionManager`, Constant Field Values

    - #### ISOLATION_DEFAULT

          static final int ISOLATION_DEFAULT

      Use the default isolation level of the underlying datastore. All other levels correspond to the JDBC isolation levels.
      See Also:
        `Connection`, Constant Field Values

    - #### ISOLATION_READ_UNCOMMITTED

          static final int ISOLATION_READ_UNCOMMITTED

      Indicates that dirty reads, non-repeatable reads and phantom reads can occur.

      This level allows a row changed by one transaction to be read by another transaction before any changes in that row have been committed (a "dirty read"). If any of the changes are rolled back, the second transaction will have retrieved an invalid row.

      See Also:
        `Connection.TRANSACTION_READ_UNCOMMITTED`, Constant Field Values

    - #### ISOLATION_READ_COMMITTED

          static final int ISOLATION_READ_COMMITTED

      Indicates that dirty reads are prevented; non-repeatable reads and phantom reads can occur.

      This level only prohibits a transaction from reading a row with uncommitted changes in it.

      See Also:
        `Connection.TRANSACTION_READ_COMMITTED`, Constant Field Values

    - #### ISOLATION_REPEATABLE_READ

          static final int ISOLATION_REPEATABLE_READ

      Indicates that dirty reads and non-repeatable reads are prevented; phantom reads can occur.

      This level prohibits a transaction from reading a row with uncommitted changes in it, and it also prohibits the situation where one transaction reads a row, a second transaction alters the row, and the first transaction re-reads the row, getting different values the second time (a "non-repeatable read").

      See Also:
        `Connection.TRANSACTION_REPEATABLE_READ`, Constant Field Values

    - #### ISOLATION_SERIALIZABLE

          static final int ISOLATION_SERIALIZABLE

      Indicates that dirty reads, non-repeatable reads and phantom reads are prevented.

      This level includes the prohibitions in `ISOLATION_REPEATABLE_READ` and further prohibits the situation where one transaction reads all rows that satisfy a `WHERE` condition, a second transaction inserts a row that satisfies that `WHERE` condition, and the first transaction re-reads for the same condition, retrieving the additional "phantom" row in the second read.

      See Also:
        `Connection.TRANSACTION_SERIALIZABLE`, Constant Field Values

    - #### TIMEOUT_DEFAULT

          static final int TIMEOUT_DEFAULT

      Use the default timeout of the underlying transaction system, or none if timeouts are not supported.
      See Also:
        Constant Field Values

  - ### Method Detail

    - #### getPropagationBehavior

          int getPropagationBehavior()

      Return the propagation behavior.

      Must return one of the `PROPAGATION_XXX` constants defined on `this interface`.

      Returns:
        the propagation behavior
      See Also:
        `PROPAGATION_REQUIRED`, `TransactionSynchronizationManager.isActualTransactionActive()`

    - #### getIsolationLevel

          int getIsolationLevel()

      Return the isolation level.

      Must return one of the `ISOLATION_XXX` constants defined on `this interface`.

      Only makes sense in combination with `PROPAGATION_REQUIRED` or `PROPAGATION_REQUIRES_NEW`.

      Note that a transaction manager that does not support custom isolation levels will throw an exception when given any other level than `ISOLATION_DEFAULT`.

      Returns:
        the isolation level

    - #### getTimeout

          int getTimeout()

      Return the transaction timeout.

      Must return a number of seconds, or `TIMEOUT_DEFAULT`.

      Only makes sense in combination with `PROPAGATION_REQUIRED` or `PROPAGATION_REQUIRES_NEW`.

      Note that a transaction manager that does not support timeouts will throw an exception when given any other timeout than `TIMEOUT_DEFAULT`.

      Returns:
        the transaction timeout

    - #### isReadOnly

          boolean isReadOnly()

      Return whether to optimize as a read-only transaction.

      The read-only flag applies to any transaction context, whether backed by an actual resource transaction (`PROPAGATION_REQUIRED`/`PROPAGATION_REQUIRES_NEW`) or operating non-transactionally at the resource level (`PROPAGATION_SUPPORTS`). In the latter case, the flag will only apply to managed resources within the application, such as a Hibernate `Session`. << *

      This just serves as a hint for the actual transaction subsystem; it will not necessarily cause failure of write access attempts. A transaction manager which cannot interpret the read-only hint will not throw an exception when asked for a read-only transaction.

      Returns:
        `true` if the transaction is to be optimized as read-only
      See Also:
        `TransactionSynchronization.beforeCommit(boolean)`, `TransactionSynchronizationManager.isCurrentTransactionReadOnly()`

    - #### getName

          String getName()

      Return the name of this transaction. Can be `null`.

      This will be used as the transaction name to be shown in a transaction monitor, if applicable (for example, WebLogic's).

      In case of Spring's declarative transactions, the exposed name will be the `fully-qualified class name + "." + method name` (by default).

      Returns:
        the name of this transaction
      See Also:
        `TransactionAspectSupport`, `TransactionSynchronizationManager.getCurrentTransactionName()`