public abstract class TransactionSynchronizationManager
extends java.lang.Object
Supports one resource per key without overwriting, that is, a resource needs to be removed before a new one can be set for the same key. Supports a list of transaction synchronizations if synchronization is active.
Resource management code should check for thread-bound resources, e.g. JDBC
Connections or Hibernate Sessions, via getResource
. Such code is
normally not supposed to bind resources to threads, as this is the responsibility
of transaction managers. A further option is to lazily bind on first use if
transaction synchronization is active, for performing transactions that span
an arbitrary number of resources.
Transaction synchronization must be activated and deactivated by a transaction
manager via initSynchronization()
and clearSynchronization()
.
This is automatically supported by AbstractPlatformTransactionManager
,
and thus by all standard Spring transaction managers, such as
JtaTransactionManager
and
DataSourceTransactionManager
.
Resource management code should only register synchronizations when this
manager is active, which can be checked via isSynchronizationActive()
;
it should perform immediate resource cleanup else. If transaction synchronization
isn't active, there is either no current transaction, or the transaction manager
doesn't support transaction synchronization.
Synchronization is for example used to always return the same resources within a JTA transaction, e.g. a JDBC Connection or a Hibernate Session for any given DataSource or SessionFactory, respectively.
isSynchronizationActive()
,
registerSynchronization(org.springframework.transaction.support.TransactionSynchronization)
,
TransactionSynchronization
,
AbstractPlatformTransactionManager.setTransactionSynchronization(int)
,
JtaTransactionManager
,
DataSourceTransactionManager
,
DataSourceUtils.getConnection(javax.sql.DataSource)
Constructor and Description |
---|
TransactionSynchronizationManager() |
Modifier and Type | Method and Description |
---|---|
static void |
bindResource(java.lang.Object key,
java.lang.Object value)
Bind the given resource for the given key to the current thread.
|
static void |
clear()
Clear the entire transaction synchronization state for the current thread:
registered synchronizations as well as the various transaction characteristics.
|
static void |
clearSynchronization()
Deactivate transaction synchronization for the current thread.
|
static java.lang.Integer |
getCurrentTransactionIsolationLevel()
Return the isolation level for the current transaction, if any.
|
static java.lang.String |
getCurrentTransactionName()
Return the name of the current transaction, or
null if none set. |
static java.lang.Object |
getResource(java.lang.Object key)
Retrieve a resource for the given key that is bound to the current thread.
|
static java.util.Map<java.lang.Object,java.lang.Object> |
getResourceMap()
Return all resources that are bound to the current thread.
|
static java.util.List<TransactionSynchronization> |
getSynchronizations()
Return an unmodifiable snapshot list of all registered synchronizations
for the current thread.
|
static boolean |
hasResource(java.lang.Object key)
Check if there is a resource for the given key bound to the current thread.
|
static void |
initSynchronization()
Activate transaction synchronization for the current thread.
|
static boolean |
isActualTransactionActive()
Return whether there currently is an actual transaction active.
|
static boolean |
isCurrentTransactionReadOnly()
Return whether the current transaction is marked as read-only.
|
static boolean |
isSynchronizationActive()
Return if transaction synchronization is active for the current thread.
|
static void |
registerSynchronization(TransactionSynchronization synchronization)
Register a new transaction synchronization for the current thread.
|
static void |
setActualTransactionActive(boolean active)
Expose whether there currently is an actual transaction active.
|
static void |
setCurrentTransactionIsolationLevel(java.lang.Integer isolationLevel)
Expose an isolation level for the current transaction.
|
static void |
setCurrentTransactionName(java.lang.String name)
Expose the name of the current transaction, if any.
|
static void |
setCurrentTransactionReadOnly(boolean readOnly)
Expose a read-only flag for the current transaction.
|
static java.lang.Object |
unbindResource(java.lang.Object key)
Unbind a resource for the given key from the current thread.
|
static java.lang.Object |
unbindResourceIfPossible(java.lang.Object key)
Unbind a resource for the given key from the current thread.
|
public static java.util.Map<java.lang.Object,java.lang.Object> getResourceMap()
Mainly for debugging purposes. Resource managers should always invoke
hasResource
for a specific resource key that they are interested in.
hasResource(java.lang.Object)
public static boolean hasResource(java.lang.Object key)
key
- the key to check (usually the resource factory)ResourceTransactionManager.getResourceFactory()
@Nullable public static java.lang.Object getResource(java.lang.Object key)
key
- the key to check (usually the resource factory)null
if noneResourceTransactionManager.getResourceFactory()
public static void bindResource(java.lang.Object key, java.lang.Object value) throws java.lang.IllegalStateException
key
- the key to bind the value to (usually the resource factory)value
- the value to bind (usually the active resource object)java.lang.IllegalStateException
- if there is already a value bound to the threadResourceTransactionManager.getResourceFactory()
public static java.lang.Object unbindResource(java.lang.Object key) throws java.lang.IllegalStateException
key
- the key to unbind (usually the resource factory)java.lang.IllegalStateException
- if there is no value bound to the threadResourceTransactionManager.getResourceFactory()
@Nullable public static java.lang.Object unbindResourceIfPossible(java.lang.Object key)
key
- the key to unbind (usually the resource factory)null
if none boundpublic static boolean isSynchronizationActive()
public static void initSynchronization() throws java.lang.IllegalStateException
java.lang.IllegalStateException
- if synchronization is already activepublic static void registerSynchronization(TransactionSynchronization synchronization) throws java.lang.IllegalStateException
Note that synchronizations can implement the
Ordered
interface.
They will be executed in an order according to their order value (if any).
synchronization
- the synchronization object to registerjava.lang.IllegalStateException
- if transaction synchronization is not activeOrdered
public static java.util.List<TransactionSynchronization> getSynchronizations() throws java.lang.IllegalStateException
java.lang.IllegalStateException
- if synchronization is not activeTransactionSynchronization
public static void clearSynchronization() throws java.lang.IllegalStateException
java.lang.IllegalStateException
- if synchronization is not activepublic static void setCurrentTransactionName(@Nullable java.lang.String name)
name
- the name of the transaction, or null
to reset itTransactionDefinition.getName()
@Nullable public static java.lang.String getCurrentTransactionName()
null
if none set.
To be called by resource management code for optimizations per use case,
for example to optimize fetch strategies for specific named transactions.TransactionDefinition.getName()
public static void setCurrentTransactionReadOnly(boolean readOnly)
readOnly
- true
to mark the current transaction
as read-only; false
to reset such a read-only markerTransactionDefinition.isReadOnly()
public static boolean isCurrentTransactionReadOnly()
Note that transaction synchronizations receive the read-only flag
as argument for the beforeCommit
callback, to be able
to suppress change detection on commit. The present method is meant
to be used for earlier read-only checks, for example to set the
flush mode of a Hibernate Session to "FlushMode.NEVER" upfront.
public static void setCurrentTransactionIsolationLevel(@Nullable java.lang.Integer isolationLevel)
isolationLevel
- the isolation level to expose, according to the
JDBC Connection constants (equivalent to the corresponding Spring
TransactionDefinition constants), or null
to reset itConnection.TRANSACTION_READ_UNCOMMITTED
,
Connection.TRANSACTION_READ_COMMITTED
,
Connection.TRANSACTION_REPEATABLE_READ
,
Connection.TRANSACTION_SERIALIZABLE
,
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
,
TransactionDefinition.ISOLATION_READ_COMMITTED
,
TransactionDefinition.ISOLATION_REPEATABLE_READ
,
TransactionDefinition.ISOLATION_SERIALIZABLE
,
TransactionDefinition.getIsolationLevel()
@Nullable public static java.lang.Integer getCurrentTransactionIsolationLevel()
null
if noneConnection.TRANSACTION_READ_UNCOMMITTED
,
Connection.TRANSACTION_READ_COMMITTED
,
Connection.TRANSACTION_REPEATABLE_READ
,
Connection.TRANSACTION_SERIALIZABLE
,
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
,
TransactionDefinition.ISOLATION_READ_COMMITTED
,
TransactionDefinition.ISOLATION_REPEATABLE_READ
,
TransactionDefinition.ISOLATION_SERIALIZABLE
,
TransactionDefinition.getIsolationLevel()
public static void setActualTransactionActive(boolean active)
active
- true
to mark the current thread as being associated
with an actual transaction; false
to reset that markerpublic static boolean isActualTransactionActive()
To be called by resource management code that wants to discriminate between active transaction synchronization (with or without backing resource transaction; also on PROPAGATION_SUPPORTS) and an actual transaction being active (with backing resource transaction; on PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, etc).
isSynchronizationActive()
public static void clear()