docs: private <T> CompletableFuture<T> executeCommandAsyncWithInjectedTx(InvocationContext ctx, VisitableCommand command) {
        CompletableFuture<T> cf;
        final Transaction implicitTransaction;
        try {
           // interceptors must not access thread-local transaction anyway
           implicitTransaction = transactionManager.suspend();
           assert implicitTransaction != null;
           //noinspection unchecked
           cf = (CompletableFuture<T>) invoker.invokeAsync(ctx, command);
        } catch (SystemException e) {
           throw new CacheException("Cannot suspend implicit transaction", e);
        } catch (Throwable e) {
           tryRollback();
           throw e;
        }
        return cf.handle((result, throwable) -> {
           if (throwable != null) {
              try {
                 implicitTransaction.rollback();
              } catch (SystemException e) {
                 log.trace("Could not rollback", e);
                 throwable.addSuppressed(e);
              }
              throw CompletableFutures.asCompletionException(throwable);
           }
           try {
              implicitTransaction.commit();
           } catch (Exception e) {
              log.couldNotCompleteInjectedTransaction(e);
              throw CompletableFutures.asCompletionException(e);
           }
           return result;
        });
     }