Top Description Fields Methods
org.springframework.transaction

public Interface TransactionDefinition

Known Direct Subinterfaces
org.springframework.transaction.interceptor.TransactionAttribute, org.springframework.transaction.support.ResourceTransactionDefinition
Known Direct Implementers
org.springframework.transaction.support.DefaultTransactionDefinition, org.springframework.transaction.support.DelegatingTransactionDefinition, org.springframework.transaction.StaticTransactionDefinition
Imports
org.springframework.lang.Nullable

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.

Author
Juergen Hoeller
Since
08.05.2003
See Also
PlatformTransactionManager#getTransaction(TransactionDefinition), org.springframework.transaction.support.DefaultTransactionDefinition, org.springframework.transaction.interceptor.TransactionAttribute

Field Summary

Modifier and TypeField and Description
public static final int
ISOLATION_DEFAULT

Use the default isolation level of the underlying datastore.

public static final int
ISOLATION_READ_COMMITTED

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

public static final int
ISOLATION_READ_UNCOMMITTED

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

public static final int
ISOLATION_REPEATABLE_READ

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

public static final int
ISOLATION_SERIALIZABLE

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

public static final int
PROPAGATION_MANDATORY

Support a current transaction; throw an exception if no current transaction exists.

public static final int
PROPAGATION_NESTED

Execute within a nested transaction if a current transaction exists, behaving like PROPAGATION_REQUIRED otherwise.

public static final int
PROPAGATION_NEVER

Do not support a current transaction; throw an exception if a current transaction exists.

public static final int
PROPAGATION_NOT_SUPPORTED

Do not support a current transaction; rather always execute non-transactionally.

public static final int
PROPAGATION_REQUIRED

Support a current transaction; create a new one if none exists.

public static final int
PROPAGATION_REQUIRES_NEW

Create a new transaction, suspending the current transaction if one exists.

public static final int
PROPAGATION_SUPPORTS

Support a current transaction; execute non-transactionally if none exists.

public static final int
TIMEOUT_DEFAULT

Use the default timeout of the underlying transaction system, or none if timeouts are not supported.

Method Summary

Modifier and TypeMethod and Description
public default int

Returns:

the isolation level
getIsolationLevel
()

Return the isolation level.

public default String

Returns:

the name of this transaction (null by default}
getName
()

Return the name of this transaction.

public default int

Returns:

the propagation behavior
getPropagationBehavior
()

Return the propagation behavior.

public default int

Returns:

the transaction timeout
getTimeout
()

Return the transaction timeout.

public default boolean

Returns:

true if the transaction is to be optimized as read-only (false by default)
isReadOnly
()

Return whether to optimize as a read-only transaction.

public static TransactionDefinition
withDefaults()

Return an unmodifiable TransactionDefinition with defaults.

Field Detail

ISOLATION_DEFAULTback to summary
public 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
java.sql.Connection
ISOLATION_READ_COMMITTEDback to summary
public 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
java.sql.Connection#TRANSACTION_READ_COMMITTED
ISOLATION_READ_UNCOMMITTEDback to summary
public 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
java.sql.Connection#TRANSACTION_READ_UNCOMMITTED
ISOLATION_REPEATABLE_READback to summary
public 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
java.sql.Connection#TRANSACTION_REPEATABLE_READ
ISOLATION_SERIALIZABLEback to summary
public 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
java.sql.Connection#TRANSACTION_SERIALIZABLE
PROPAGATION_MANDATORYback to summary
public 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.

PROPAGATION_NESTEDback to summary
public static final int PROPAGATION_NESTED

Execute within a nested transaction if a current transaction exists, behaving like PROPAGATION_REQUIRED otherwise. 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 org.springframework.jdbc.datasource.DataSourceTransactionManager when working on a JDBC 3.0+ driver. Some JTA providers might support nested transactions as well.

See Also
org.springframework.jdbc.datasource.DataSourceTransactionManager
PROPAGATION_NEVERback to summary
public 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.

PROPAGATION_NOT_SUPPORTEDback to summary
public 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 org.springframework.transaction.jta.JtaTransactionManager, which requires the jakarta.transaction.TransactionManager to be made available to it (which is server-specific in standard Jakarta EE).

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

See Also
org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
PROPAGATION_REQUIREDback to summary
public 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.

PROPAGATION_REQUIRES_NEWback to summary
public 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 org.springframework.transaction.jta.JtaTransactionManager, which requires the jakarta.transaction.TransactionManager to be made available to it (which is server-specific in standard Jakarta EE).

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

See Also
org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
PROPAGATION_SUPPORTSback to summary
public 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
org.springframework.transaction.support.AbstractPlatformTransactionManager#setTransactionSynchronization, org.springframework.transaction.support.AbstractPlatformTransactionManager#SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
TIMEOUT_DEFAULTback to summary
public static final int TIMEOUT_DEFAULT

Use the default timeout of the underlying transaction system, or none if timeouts are not supported.

Method Detail

getIsolationLevelback to summary
public default int getIsolationLevel()

Return the isolation level.

Must return one of the ISOLATION_XXX constants defined on this interface. Those constants are designed to match the values of the same constants on java.sql.Connection.

Exclusively designed for use with PROPAGATION_REQUIRED or PROPAGATION_REQUIRES_NEW since it only applies to newly started transactions. Consider switching the "validateExistingTransactions" flag to "true" on your transaction manager if you'd like isolation level declarations to get rejected when participating in an existing transaction with a different isolation level.

The default is ISOLATION_DEFAULT. 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:int

the isolation level

See Also
ISOLATION_DEFAULT, org.springframework.transaction.support.AbstractPlatformTransactionManager#setValidateExistingTransaction
getNameback to summary
public default 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.

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

Returns:String

the name of this transaction (null by default}

Annotations
@Nullable
See Also
org.springframework.transaction.interceptor.TransactionAspectSupport, org.springframework.transaction.support.TransactionSynchronizationManager#getCurrentTransactionName()
getPropagationBehaviorback to summary
public default int getPropagationBehavior()

Return the propagation behavior.

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

The default is PROPAGATION_REQUIRED.

Returns:int

the propagation behavior

See Also
PROPAGATION_REQUIRED, org.springframework.transaction.support.TransactionSynchronizationManager#isActualTransactionActive()
getTimeoutback to summary
public default int getTimeout()

Return the transaction timeout.

Must return a number of seconds, or TIMEOUT_DEFAULT.

Exclusively designed for use with PROPAGATION_REQUIRED or PROPAGATION_REQUIRES_NEW since it only applies to newly started transactions.

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

The default is TIMEOUT_DEFAULT.

Returns:int

the transaction timeout

isReadOnlyback to summary
public default 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:boolean

true if the transaction is to be optimized as read-only (false by default)

See Also
org.springframework.transaction.support.TransactionSynchronization#beforeCommit(boolean), org.springframework.transaction.support.TransactionSynchronizationManager#isCurrentTransactionReadOnly()
withDefaultsback to summary
public static TransactionDefinition withDefaults()

Return an unmodifiable TransactionDefinition with defaults.

For customization purposes, use the modifiable org.springframework.transaction.support.DefaultTransactionDefinition instead.

Since
5.2