Mohammad opened SPR-12560 and commented
Exception thrown in TransactionSynchronization's afterComplete method doesn't be propagated back to calling method. Reason is org.springframework.transaction.support.TransactionSynchronizationUtils class invokeAfterCompletion has below implementation -
public static void invokeAfterCompletion(List\
synchronizations, int completionStatus) { if (synchronizations != null) { for (TransactionSynchronization synchronization : synchronizations) { try { synchronization.afterCompletion(completionStatus); } catch (Throwable tsex) { logger.error("TransactionSynchronization.afterCompletion threw exception", tsex); } } } }
Since it is calling multiple synchronizer in a row hence they are eating exception and just logging it(which is clearly written as java doc). I think there should be a way to throw exception so that if required client code can perform some operation.
One solution would be to run afterComplete method in different threads and propagate exceptions with that thread. For programmatic transaction management, we would get know exception (Considering declarative transaction interceptors would not help as control won't come to client code)
Reference question in stackoverflow is - http://stackoverflow.com/questions/27563561/transactionsynchronization-sallow-runtimeexception-that-is-thrown-while-aftercom?noredirect=1#comment43558721_27563561
Affects: 4.0.3
Comment From: spring-projects-issues
Mohammad commented
do we have any resolution date?
Comment From: spring-projects-issues
Bulk closing outdated, unresolved issues. Please, reopen if still relevant.
Comment From: slinstaedt
Yep, still relevant. Only issue is logging level had been decreased to debug, so devs won't even recognised, something went wrong, because in most setup's will filter debug level log messages.
Comment From: sbrannen
@slinstaedt, with which Spring Framework version(s) are you experiencing this?
Comment From: slinstaedt
org.springframework:spring-tx:jar:5.3.18
which should be part of spring boot 2.5.12.
Comment From: KSH-code
it was fixed by https://github.com/spring-projects/spring-framework/pull/30776 so it is included in https://github.com/spring-projects/spring-framework/releases/tag/v6.0.11 and https://github.com/spring-projects/spring-framework/releases/tag/v5.3.29
Comment From: bclozel
Thanks @KSH-code !
While the original issue was more about making that exception available through a callback of some sort, the reason for reopening it is indeed about the logging level.
Closing this issue as a superseded by #30776
Comment From: stefanrybacki
still relevant, logging alone does not help