Philippe Marschall opened SPR-15749 and commented
Most places in spring-tx treat RuntimeException and Error equally rolling back in both cases as both of them are unchecked. This can be seen in TransactionAspectSupport. completeTransactionAfterThrowing and DefaultTransactionAttribute. rollbackOn
The execution path for CallbackPreferringPlatformTransactionManager seems to be different
https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java#L319
where an Error is not thrown but instead wrapped in a ThrowableHolderException. However looking at the code in UOWActionAdapter.run (used by the only present implementation of CallbackPreferringPlatformTransactionManager) any kind of Throwable seems to cause a rollback. It seems to me as if RuntimeException and Error should be treated equally in the CallbackPreferringPlatformTransactionManager path in TransactionAspectSupport.java
Affects: 4.3.9
Comment From: jhoeller
This is trying to prevent the direct propagation of Error to the (WebSphere) server that calls us back there (since the server might allergically react to that), rather unwrapping the holder exception back to an Error once we are in control of the call stack again.
Also, the WebSphere implementation is not available in Spring Framework 6.x anymore, so the entire mechanism is only really there for custom external integration purposes now.