- All Implemented Interfaces:
- TransactionSynchronizationRegistry
public class TransactionSynchronizationRegistryWrapper
extends Object
implements TransactionSynchronizationRegistry
Most of this implementation delegates down to the underlying transactions implementation to provide the services of the
TransactionSynchronizationRegistry. The one area it modifies is the registration of the interposed Synchronizations. The
reason this implementation needs to differ is because the JCA Synchronization and JPA Synchronizations are both specified as
Interposed however there are defined ordering requirements between them both.
The current implementation orders JCA relative to all other Synchronizations. For beforeCompletion, it would be possible to
restrict this to the one case where JCA is ordered before JPA, however it is possible that other interposed Synchronizations
would require the services of JCA and as such if the JCA is allowed to execute delistResource during beforeCompletion as
mandated in JCA spec the behaviour of those subsequent interactions would be broken. For afterCompletion the JCA
synchronizations are called last as that allows JCA to detect connection leaks from frameworks that have not closed the JCA
managed resources. This is described in (for example)
http://docs.oracle.com/javaee/5/api/javax/transaction/TransactionSynchronizationRegistry
.html#registerInterposedSynchronization(javax.transaction.Synchronization) where it says that during afterCompletion
"Resources can be closed but no transactional work can be performed with them".
One implication of this approach is that if the underlying transactions implementation has special handling for various types
of Synchronization that can also implement other interfaces (i.e. if interposedSync instanceof OtherInterface) these
behaviours cannot take effect as the underlying implementation will never directly see the actual Synchronizations.