code: protected <RESULT> RESULT performTx(TransactionShow<RESULT> txLambda, TransactionManagerAdapter adapter, TransactionGenre genre)
              throws Throwable {
          final BegunTx<RESULT> tx = newBegunTransaction(genre);
          BegunTxContext.setBegunTxOnThread(tx);
          try {
              txLambda.perform(tx);
              if (tx.isRollbackOnly()) { // e.g. when validation error
                  adapter.setRollbackOnly();
              }
              return tx.getResult();
          } catch (Throwable e) {
              // same as DefaultTransactionCallback
              // forcedly roll-backed if exception in 'required' transaction scope
              adapter.setRollbackOnly();
              throw e;
          } finally {
              BegunTxContext.clearBegunTxOnThread();
          }
      }
docs: ===================