code: @Override
     public Object handleDefault(InvocationContext ctx, VisitableCommand command) throws Throwable {
        if (!ctx.isOriginLocal()) {
           // Nothing to do for remote calls
           return invokeNext(ctx, command);
        }
  
        Transaction tx;
        if (transactionManager.getTransaction() != null || (tx = batchContainer.getBatchTransaction()) == null) {
           // The active transaction means we are in an auto-batch.
           // No batch means a read-only auto-batch.
           // Either way, we don't need to do anything
           return invokeNext(ctx, command);
        }
  
        try {
           transactionManager.resume(tx);
           if (ctx.isInTxScope()) {
              return invokeNext(ctx, command);
           }
  
           log.tracef("Called with a non-tx invocation context: %s", ctx);
           InvocationContext txInvocationContext = invocationContextFactory.createInvocationContext(true, -1);
           return invokeNext(txInvocationContext, command);
        } finally {
           suspendTransaction();
        }
     }
docs: Simply check if there is an ongoing tx. <ul> <li>If there is one, this is a no-op and just passes the call up the
  chain.</li> <li>If there isn't one and there is a batch in progress, resume the batch's tx, pass up, and finally
  suspend the batch's tx.</li> <li>If there is no batch in progress, just pass the call up the chain.</li> </ul>