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 AbstractSynchronousTransactionManager
,
and thus by all standard transaction managers.
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(io.micronaut.transaction.support.TransactionSynchronization)
,
TransactionSynchronization
,
AbstractSynchronousStateTransactionManager.setTransactionSynchronization(io.micronaut.transaction.support.AbstractSynchronousStateTransactionManager.Synchronization)
Modifier and Type | Class and Description |
---|---|
static interface |
TransactionSynchronizationManager.TransactionSynchronizationState
The synchronization state.
|
Modifier and Type | Field and Description |
---|---|
static java.lang.Object |
DEFAULT_STATE_KEY |
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 |
bindSynchronousTransactionState(java.lang.Object key,
SynchronousTransactionState state) |
static void |
clear()
Deprecated.
|
static void |
clearSynchronization()
Deprecated.
|
static <T> java.util.function.Supplier<T> |
decorateToPropagateState(java.util.function.Supplier<T> supplier)
Decorate the supplier with possible propagated state in thread-local.
|
static TransactionDefinition.Isolation |
getCurrentTransactionIsolationLevel()
Deprecated.
|
static java.lang.String |
getCurrentTransactionName()
Deprecated.
|
static TransactionSynchronizationManager.TransactionSynchronizationState |
getOrCreateState()
Get existing or create new associated state.
|
static SynchronousTransactionState |
getRequiredSynchronousTransactionState(java.lang.Object key) |
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 TransactionSynchronizationManager.TransactionSynchronizationState |
getState()
Get the existing state.
|
static java.util.List<TransactionSynchronization> |
getSynchronizations()
Deprecated.
|
static SynchronousTransactionState |
getSynchronousTransactionState(java.lang.Object key) |
static SynchronousTransactionState |
getSynchronousTransactionStateOrCreate(java.lang.Object key,
java.util.function.Supplier<SynchronousTransactionState> creator) |
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()
Deprecated.
|
static boolean |
isActualTransactionActive()
Deprecated.
|
static boolean |
isCurrentTransactionReadOnly()
Deprecated.
|
static boolean |
isSynchronizationActive()
Deprecated.
|
static void |
registerSynchronization(TransactionSynchronization synchronization)
Deprecated.
|
static void |
setActualTransactionActive(boolean active)
Deprecated.
|
static void |
setCurrentTransactionIsolationLevel(TransactionDefinition.Isolation isolationLevel)
Deprecated.
|
static void |
setCurrentTransactionName(java.lang.String name)
Deprecated.
|
static void |
setCurrentTransactionReadOnly(boolean readOnly)
Deprecated.
|
static void |
setState(TransactionSynchronizationManager.TransactionSynchronizationState state)
Restore the state from the thread local.
|
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.
|
static SynchronousTransactionState |
unbindSynchronousTransactionState(java.lang.Object key) |
static <T> T |
withState(TransactionSynchronizationManager.TransactionSynchronizationState state,
java.util.function.Supplier<T> supplier)
Execute provided supplier with setup state in the thread-local.
|
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 void bindSynchronousTransactionState(@NonNull java.lang.Object key, @NonNull SynchronousTransactionState state)
public static SynchronousTransactionState unbindSynchronousTransactionState(java.lang.Object key) throws java.lang.IllegalStateException
java.lang.IllegalStateException
@Nullable public static SynchronousTransactionState getSynchronousTransactionState(@NonNull java.lang.Object key)
@NonNull public static SynchronousTransactionState getRequiredSynchronousTransactionState(@NonNull java.lang.Object key)
@NonNull public static SynchronousTransactionState getSynchronousTransactionStateOrCreate(@NonNull java.lang.Object key, java.util.function.Supplier<SynchronousTransactionState> creator)
@Deprecated public static boolean isSynchronizationActive()
getSynchronousTransactionState(Object)
registerSynchronization(io.micronaut.transaction.support.TransactionSynchronization)
@Deprecated public static void initSynchronization() throws java.lang.IllegalStateException
getSynchronousTransactionState(Object)
java.lang.IllegalStateException
- if synchronization is already active@Deprecated public static void registerSynchronization(TransactionSynchronization synchronization) throws java.lang.IllegalStateException
getSynchronousTransactionState(Object)
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
@Deprecated public static java.util.List<TransactionSynchronization> getSynchronizations() throws java.lang.IllegalStateException
getSynchronousTransactionState(Object)
java.lang.IllegalStateException
- if synchronization is not activeTransactionSynchronization
@Deprecated public static void clearSynchronization() throws java.lang.IllegalStateException
getSynchronousTransactionState(Object)
java.lang.IllegalStateException
- if synchronization is not active@Deprecated public static void setCurrentTransactionName(@Nullable java.lang.String name)
getSynchronousTransactionState(Object)
name
- the name of the transaction, or null
to reset itTransactionDefinition.getName()
@Deprecated @Nullable public static java.lang.String getCurrentTransactionName()
getSynchronousTransactionState(Object)
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()
@Deprecated public static void setCurrentTransactionReadOnly(boolean readOnly)
getSynchronousTransactionState(Object)
readOnly
- true
to mark the current transaction
as read-only; false
to reset such a read-only markerTransactionDefinition.isReadOnly()
@Deprecated public static boolean isCurrentTransactionReadOnly()
getSynchronousTransactionState(Object)
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.
TransactionDefinition.isReadOnly()
,
TransactionSynchronization.beforeCommit(boolean)
@Deprecated public static void setCurrentTransactionIsolationLevel(@Nullable TransactionDefinition.Isolation isolationLevel)
getSynchronousTransactionState(Object)
isolationLevel
- the isolation level to expose, according to the
JDBC Connection constants (equivalent to the corresponding
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 @Deprecated public static TransactionDefinition.Isolation getCurrentTransactionIsolationLevel()
getSynchronousTransactionState(Object)
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()
@Deprecated public static void setActualTransactionActive(boolean active)
getSynchronousTransactionState(Object)
active
- true
to mark the current thread as being associated
with an actual transaction; false
to reset that marker@Deprecated public static boolean isActualTransactionActive()
getSynchronousTransactionState(Object)
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()
@Deprecated public static void clear()
getSynchronousTransactionState(Object)
@Internal @Nullable public static TransactionSynchronizationManager.TransactionSynchronizationState getState()
@Internal @NonNull public static TransactionSynchronizationManager.TransactionSynchronizationState getOrCreateState()
@Internal public static void setState(@Nullable TransactionSynchronizationManager.TransactionSynchronizationState state)
state
- The state@Internal public static <T> T withState(@Nullable TransactionSynchronizationManager.TransactionSynchronizationState state, java.util.function.Supplier<T> supplier)
T
- The supplied typestate
- The statesupplier
- The supplier to be executed@Internal public static <T> java.util.function.Supplier<T> decorateToPropagateState(java.util.function.Supplier<T> supplier)
T
- The supplied typesupplier
- The supplier to be decorated