Class ContextSourceTransactionManager
- All Implemented Interfaces:
Serializable
,org.springframework.beans.factory.InitializingBean
,org.springframework.transaction.ConfigurableTransactionManager
,org.springframework.transaction.PlatformTransactionManager
,org.springframework.transaction.TransactionManager
NOTE: The transactions provided by this TransactionManager are all client side and are by no means 'real' transactions, in the sense that we know them in the ordinary database world, e.g.:
- Should the transaction failure be caused by a network failure, there is no way whatsoever that this TransactionManager can restore the database state. In this case, all possibilities for rollback will be utterly lost.
- Transaction isolation is not provided, i.e. entries participating in a transaction for one client may very well participate in another transaction for another client at the same time. Should one of these transactions be rolled back, the outcome of this is undetermined, and may in the worst case result in total failure.
While the points above should be noted and considered, the compensating transaction approach will be perfectly sufficient for all but the most unfortunate of circumstances. Considering that there currently is a total absence of server-side transaction support in the LDAP world, being able to mark operations as transactional in the same way as for relational database operations is surely a step forward.
An LDAP transaction is tied to a ContextSource
, to be supplied to the
setContextSource(ContextSource)
method. While the actual ContextSource used by
the target LdapTemplate instance needs to be of the type
TransactionAwareContextSourceProxy
, the ContextSource supplied to this class
should be the actual target ContextSource.
Using this TransactionManager along with TransactionAwareContextSourceProxy
,
all modifying operations (bind, unbind, rebind, rename, modifyAttributes) in a
transaction will be intercepted. Each modification has its corresponding
CompensatingTransactionOperationRecorder
, which collects the information
necessary to perform a rollback and produces a
CompensatingTransactionOperationExecutor
which is then used to execute the
actual operation and is later called for performing the commit or rollback.
For several of the operations, performing a rollback is pretty straightforward. For
example, in order to roll back a rename operation, it will only be required to rename
the entry back to its original position. For other operations, however, it's a bit more
complicated. An unbind operation is not possible to roll back by simply binding the
entry back with the attributes retrieved from the original entry. It might not be
possible to get all the information from the original entry. Consequently, the
UnbindOperationExecutor
will move the original entry to a temporary location in
its performOperation() method. The commit() method will know that everything went well,
so it will be OK to unbind the entry. The rollback operation will be to rename the
entry back to its original location. The same behaviour is used for rebind()
operations. The operation of calculating a temporary location for an entry is delegated
to a TempEntryRenamingStrategy
(default
DefaultTempEntryRenamingStrategy
), specified in
setRenamingStrategy(TempEntryRenamingStrategy)
.
The actual work of this Transaction Manager is delegated to a
ContextSourceTransactionManagerDelegate
. This is because the exact same logic
needs to be used if we want to wrap a JDBC and LDAP transaction in the same logical
transaction.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager
org.springframework.transaction.support.AbstractPlatformTransactionManager.SuspendedResourcesHolder
-
Field Summary
Fields inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager
logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
protected void
protected void
doCleanupAfterCompletion
(Object transaction) protected void
doCommit
(org.springframework.transaction.support.DefaultTransactionStatus status) protected Object
protected void
doRollback
(org.springframework.transaction.support.DefaultTransactionStatus status) Get the ContextSource.protected boolean
isExistingTransaction
(Object transaction) void
setContextSource
(ContextSource contextSource) Set the ContextSource.void
setRenamingStrategy
(TempEntryRenamingStrategy renamingStrategy) Set theTempEntryRenamingStrategy
.Methods inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager
commit, determineTimeout, doResume, doSetRollbackOnly, doSuspend, getDefaultTimeout, getTransaction, getTransactionExecutionListeners, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, prepareForCommit, prepareSynchronization, registerAfterCompletionWithExistingTransaction, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionExecutionListeners, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, shouldCommitOnGlobalRollbackOnly, suspend, triggerBeforeCommit, triggerBeforeCompletion, useSavepointForNestedTransaction
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.springframework.transaction.ConfigurableTransactionManager
addListener
-
Constructor Details
-
ContextSourceTransactionManager
public ContextSourceTransactionManager()
-
-
Method Details
-
doBegin
protected void doBegin(Object transaction, org.springframework.transaction.TransactionDefinition definition) - Specified by:
doBegin
in classorg.springframework.transaction.support.AbstractPlatformTransactionManager
-
doCleanupAfterCompletion
- Overrides:
doCleanupAfterCompletion
in classorg.springframework.transaction.support.AbstractPlatformTransactionManager
-
doCommit
protected void doCommit(org.springframework.transaction.support.DefaultTransactionStatus status) - Specified by:
doCommit
in classorg.springframework.transaction.support.AbstractPlatformTransactionManager
-
doGetTransaction
- Specified by:
doGetTransaction
in classorg.springframework.transaction.support.AbstractPlatformTransactionManager
-
doRollback
protected void doRollback(org.springframework.transaction.support.DefaultTransactionStatus status) - Specified by:
doRollback
in classorg.springframework.transaction.support.AbstractPlatformTransactionManager
-
getContextSource
Get the ContextSource.- Returns:
- the contextSource.
- See Also:
-
setContextSource
Set the ContextSource.- Parameters:
contextSource
- the ContextSource.- See Also:
-
setRenamingStrategy
Set theTempEntryRenamingStrategy
.- Parameters:
renamingStrategy
- the Renaming Strategy.- See Also:
-
afterPropertiesSet
- Specified by:
afterPropertiesSet
in interfaceorg.springframework.beans.factory.InitializingBean
- Throws:
Exception
-
isExistingTransaction
protected boolean isExistingTransaction(Object transaction) throws org.springframework.transaction.TransactionException - Overrides:
isExistingTransaction
in classorg.springframework.transaction.support.AbstractPlatformTransactionManager
- Throws:
org.springframework.transaction.TransactionException
-