|
The Spring Framework | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
public interface TransactionDefinition
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
and PROPAGATION_REQUIRES_NEW
can
cause that, it usually doesn't make sense to specify those settings in
all 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
.
PlatformTransactionManager.getTransaction(TransactionDefinition)
,
DefaultTransactionDefinition
,
TransactionAttribute
Field Summary | |
---|---|
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
Execute non-transactionally, throw an exception if a transaction exists. |
static int |
PROPAGATION_NOT_SUPPORTED
Execute non-transactionally, suspend the current transaction if one exists. |
static int |
PROPAGATION_REQUIRED
Support a current transaction, create a new one if none exists. |
static int |
PROPAGATION_REQUIRES_NEW
Create a new transaction, suspend the current transaction if one exists. |
static int |
PROPAGATION_SUPPORTS
Support a current transaction, execute non-transactionally if no current exists. |
static int |
TIMEOUT_DEFAULT
Use the default timeout of the underlying transaction system, or none if timeouts are not supported. |
Method Summary | |
---|---|
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 |
---|
static final int PROPAGATION_REQUIRED
This is typically the default setting of a transaction definition.
static final int PROPAGATION_SUPPORTS
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 will apply for. As a consequence, the same resources
(a JDBC Connection
, a Hibernate Session
,
etc.) will be shared for the entire specified scope. Note that this
depends on the actual synchronization configuration of the
transaction manager.
AbstractPlatformTransactionManager.setTransactionSynchronization(int)
,
Constant Field Valuesstatic final int PROPAGATION_MANDATORY
static final int PROPAGATION_REQUIRES_NEW
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).
JtaTransactionManager.setTransactionManager(javax.transaction.TransactionManager)
,
Constant Field Valuesstatic final int PROPAGATION_NOT_SUPPORTED
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).
JtaTransactionManager.setTransactionManager(javax.transaction.TransactionManager)
,
Constant Field Valuesstatic final int PROPAGATION_NEVER
static final int PROPAGATION_NESTED
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.
DataSourceTransactionManager
,
Constant Field Valuesstatic final int ISOLATION_DEFAULT
Connection
,
Constant Field Valuesstatic final int ISOLATION_READ_UNCOMMITTED
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.
Connection.TRANSACTION_READ_UNCOMMITTED
,
Constant Field Valuesstatic final int ISOLATION_READ_COMMITTED
This level only prohibits a transaction from reading a row with uncommitted changes in it.
Connection.TRANSACTION_READ_COMMITTED
,
Constant Field Valuesstatic final int ISOLATION_REPEATABLE_READ
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 rereads the row, getting different values the second time (a "non-repeatable read").
Connection.TRANSACTION_REPEATABLE_READ
,
Constant Field Valuesstatic final int ISOLATION_SERIALIZABLE
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 rereads for the same condition, retrieving
the additional "phantom" row in the second read.
Connection.TRANSACTION_SERIALIZABLE
,
Constant Field Valuesstatic final int TIMEOUT_DEFAULT
Method Detail |
---|
int getPropagationBehavior()
Must return one of the PROPAGATION_XXX
constants
defined on this interface
.
PROPAGATION_REQUIRED
,
TransactionSynchronizationManager.isActualTransactionActive()
int getIsolationLevel()
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
.
int getTimeout()
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
.
boolean isReadOnly()
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 that cannot interpret the read-only hint will not throw an exception when given asked for a read-only transaction.
true
if the transaction is to be optimized as read-onlyTransactionSynchronization.beforeCommit(boolean)
,
TransactionSynchronizationManager.isCurrentTransactionReadOnly()
String getName()
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
must (and will) be the
fully-qualified class name + "." + method name
(by default).
TransactionAspectSupport
,
TransactionSynchronizationManager.getCurrentTransactionName()
|
The Spring Framework | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |