So is it a bug in TxInterceptor?:
public void afterCompletion(int status)
// could happen if a rollback is called and beforeCompletion() doesn't get called.
if (ctx == null)
ctx = invocationContextContainer.get();
setTransactionalContext(tx, gtx, transactionContext, ctx);
if afterCompletion() is called in a different thread than beforeCompletion() was called, then ctx is not null and invocation context is not initialized