Is there any reason why we can't just mark the tx as completed after doing the actual commit? It doesn't have to be in the perform() method either, it could be in TxInterceptor instead so that it's synchronized by TransactionSynchronizationInterceptor.