* would be eaten).
*
* In a JTA env, the before transaction completion is called before the flush, so not all changes are yet
* written. However, Synchronization-s do propagate exceptions, so they can be safely used.
*/
final ActionQueue actionQueue = eventSource.getActionQueue();
boolean isLocal = isLocalTransaction();
if ( isLocal ) {
//if local tx never use Synchronization
actionQueue.registerProcess( new DelegateToSynchronizationOnBeforeTx( synchronization ) );
}
else {
//TODO could we remove the action queue registration in this case?
actionQueue.registerProcess( new DelegateToSynchronizationOnBeforeTx( synchronization ) );
eventSource.getTransaction().registerSynchronization(
new BeforeCommitSynchronizationDelegator( synchronization )
);
}
//executed in all environments
actionQueue.registerProcess( new DelegateToSynchronizationOnAfterTx( synchronization ) );
}
else {
//registerSynchronization is only called if isRealTransactionInProgress or if
// a flushListener was found; still we might need to find the listener again
// as it might have been cleared by serialization (is transient).