@Override
  protected void manageTransaction() throws Throwable {
    // first associate the tx on this thread, by resuming the tx
    final Transaction transaction =
        this.transactionsRepository.getImportedTransaction(this.xidTransactionID);
    if (transaction == null) {
      if (EjbLogger.EJB3_INVOCATION_LOGGER.isDebugEnabled()) {
        // this happens if no ejb invocations where made within the TX
        EjbLogger.EJB3_INVOCATION_LOGGER.debug(
            "Not forgetting transaction "
                + this.xidTransactionID
                + " as is was not found on the server");
      }
      return;
    }
    this.resumeTransaction(transaction);

    // "forget"
    final Xid xid = this.xidTransactionID.getXid();
    try {
      // get the subordinate tx
      final SubordinateTransaction subordinateTransaction =
          SubordinationManager.getTransactionImporter().getImportedTransaction(xid);

      if (subordinateTransaction == null) {
        throw new XAException(XAException.XAER_INVAL);
      }
      // invoke forget
      subordinateTransaction.doForget();

    } catch (Exception ex) {
      final XAException xaException = new XAException(XAException.XAER_RMERR);
      xaException.initCause(ex);
      throw xaException;

    } finally {
      SubordinationManager.getTransactionImporter().removeImportedTransaction(xid);
      // disassociate the tx that was associated (resumed) on this thread.
      // This needs to be done explicitly because the SubOrdinationManager isn't responsible
      // for clearing the tx context from the thread
      this.transactionsRepository.getTransactionManager().suspend();
    }
  }