public class TransactionSynchronizationManager extends 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 context-bound resources, e.g.
database connections, via getResource
. Such code is normally not
supposed to bind resources to units of work, 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 AbstractReactiveTransactionManager
,
and thus by all standard Spring 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 transaction, e.g. a database connection for any given connection factory.
isSynchronizationActive()
,
registerSynchronization(org.springframework.transaction.reactive.TransactionSynchronization)
,
TransactionSynchronization
Constructor and Description |
---|
TransactionSynchronizationManager(TransactionContext transactionContext) |
Modifier and Type | Method and Description |
---|---|
void |
bindResource(Object key,
Object value)
Bind the given resource for the given key to the current context.
|
void |
clear()
Clear the entire transaction synchronization state:
registered synchronizations as well as the various transaction characteristics.
|
void |
clearSynchronization()
Deactivate transaction synchronization for the current context.
|
static reactor.core.publisher.Mono<TransactionSynchronizationManager> |
forCurrentTransaction()
Get the
TransactionSynchronizationManager that is associated with
the current transaction context. |
Integer |
getCurrentTransactionIsolationLevel()
Return the isolation level for the current transaction, if any.
|
String |
getCurrentTransactionName()
Return the name of the current transaction, or
null if none set. |
Object |
getResource(Object key)
Retrieve a resource for the given key that is bound to the current context.
|
List<TransactionSynchronization> |
getSynchronizations()
Return an unmodifiable snapshot list of all registered synchronizations
for the current context.
|
boolean |
hasResource(Object key)
Check if there is a resource for the given key bound to the current context.
|
void |
initSynchronization()
Activate transaction synchronization for the current context.
|
boolean |
isActualTransactionActive()
Return whether there currently is an actual transaction active.
|
boolean |
isCurrentTransactionReadOnly()
Return whether the current transaction is marked as read-only.
|
boolean |
isSynchronizationActive()
Return if transaction synchronization is active for the current context.
|
void |
registerSynchronization(TransactionSynchronization synchronization)
Register a new transaction synchronization for the current context.
|
void |
setActualTransactionActive(boolean active)
Expose whether there currently is an actual transaction active.
|
void |
setCurrentTransactionIsolationLevel(Integer isolationLevel)
Expose an isolation level for the current transaction.
|
void |
setCurrentTransactionName(String name)
Expose the name of the current transaction, if any.
|
void |
setCurrentTransactionReadOnly(boolean readOnly)
Expose a read-only flag for the current transaction.
|
Object |
unbindResource(Object key)
Unbind a resource for the given key from the current context.
|
Object |
unbindResourceIfPossible(Object key)
Unbind a resource for the given key from the current context.
|
public TransactionSynchronizationManager(TransactionContext transactionContext)
public static reactor.core.publisher.Mono<TransactionSynchronizationManager> forCurrentTransaction()
TransactionSynchronizationManager
that is associated with
the current transaction context.
Mainly intended for code that wants to bind resources or synchronizations.
NoTransactionException
- if the transaction info cannot be found —
for example, because the method was invoked outside a managed transactionpublic boolean hasResource(Object key)
key
- the key to check (usually the resource factory)@Nullable public Object getResource(Object key)
key
- the key to check (usually the resource factory)null
if nonepublic void bindResource(Object key, Object value) throws IllegalStateException
key
- the key to bind the value to (usually the resource factory)value
- the value to bind (usually the active resource object)IllegalStateException
- if there is already a value bound to the contextpublic Object unbindResource(Object key) throws IllegalStateException
key
- the key to unbind (usually the resource factory)IllegalStateException
- if there is no value bound to the context@Nullable public Object unbindResourceIfPossible(Object key)
key
- the key to unbind (usually the resource factory)null
if none boundpublic boolean isSynchronizationActive()
public void initSynchronization() throws IllegalStateException
IllegalStateException
- if synchronization is already activepublic void registerSynchronization(TransactionSynchronization synchronization) throws 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 registerIllegalStateException
- if transaction synchronization is not activeOrdered
public List<TransactionSynchronization> getSynchronizations() throws IllegalStateException
IllegalStateException
- if synchronization is not activeTransactionSynchronization
public void clearSynchronization() throws IllegalStateException
IllegalStateException
- if synchronization is not activepublic void setCurrentTransactionName(@Nullable String name)
name
- the name of the transaction, or null
to reset itTransactionDefinition.getName()
@Nullable public 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 void setCurrentTransactionReadOnly(boolean readOnly)
readOnly
- true
to mark the current transaction
as read-only; false
to reset such a read-only markerTransactionDefinition.isReadOnly()
public 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.
public void setCurrentTransactionIsolationLevel(@Nullable Integer isolationLevel)
isolationLevel
- the isolation level to expose, according to the
R2DBC Connection constants (equivalent to the corresponding Spring
TransactionDefinition constants), or null
to reset itTransactionDefinition.ISOLATION_READ_UNCOMMITTED
,
TransactionDefinition.ISOLATION_READ_COMMITTED
,
TransactionDefinition.ISOLATION_REPEATABLE_READ
,
TransactionDefinition.ISOLATION_SERIALIZABLE
,
TransactionDefinition.getIsolationLevel()
@Nullable public Integer getCurrentTransactionIsolationLevel()
null
if noneTransactionDefinition.ISOLATION_READ_UNCOMMITTED
,
TransactionDefinition.ISOLATION_READ_COMMITTED
,
TransactionDefinition.ISOLATION_REPEATABLE_READ
,
TransactionDefinition.ISOLATION_SERIALIZABLE
,
TransactionDefinition.getIsolationLevel()
public void setActualTransactionActive(boolean active)
active
- true
to mark the current context as being associated
with an actual transaction; false
to reset that markerpublic 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 void clear()