If the exception is thrown during managedFlush in SynchronizationCallbackCoordinatorNonTrackingImpl beforeCompletion() method then setRollbackOnly() is called in catch block and then exception is rethrown. For WebSphere setRollbackOnly() throws UnsupportedOperationException hence the original exception is swallowed up making debugging a challenge.
It should be something like below in beforeCompletion() method
try { if ( flush ) { LOG.trace( "Automatically flushing session" ); transactionCoordinator.getTransactionContext().managedFlush(); }
} catch ( RuntimeException re ) { try { setRollbackOnly(); }
catch ( UnsupportedOperationException e ) { LOG.warn( "transaction rollback not supported", e ); /*ignore UnsupportedOperationException thrown from WebSphereExtendedJtaPlatform*/ }
catch ( Exception e ) { LOG.error("error during transaction rollback after error during managed flush", e); }
throw exceptionMapper.mapManagedFlushFailure( "error during managed flush", re ); }
|