private void replayModificationsInTransaction(PrepareCommand command, boolean onePhaseCommit)
        throws Throwable {
      TransactionManager tm = txManager();
      boolean replaySuccessful = false;
      try {

        tm.begin();
        replayModifications(command);
        replaySuccessful = true;
      } finally {
        LocalTransaction localTx = txTable().getLocalTransaction(tm.getTransaction());
        if (localTx
            != null) { // possible for the tx to be null if we got an exception during applying
                       // modifications
          localTx.setFromRemoteSite(true);

          if (onePhaseCommit) {
            if (replaySuccessful) {
              log.tracef(
                  "Committing remotely originated tx %s as it is 1PC",
                  command.getGlobalTransaction());
              tm.commit();
            } else {
              log.tracef("Rolling back remotely originated tx %s", command.getGlobalTransaction());
              tm.rollback();
            }
          } else { // Wait for a remote commit/rollback.
            remote2localTx.put(command.getGlobalTransaction(), localTx.getGlobalTransaction());
            tm.suspend();
          }
        }
      }
    }
 private void completeTransaction(GlobalTransaction globalTransaction, boolean commit)
     throws Throwable {
   TransactionTable txTable = txTable();
   GlobalTransaction localTxId = remote2localTx.remove(globalTransaction);
   if (localTxId == null) {
     throw new CacheException(
         "Couldn't find a local transaction corresponding to remote transaction "
             + globalTransaction);
   }
   LocalTransaction localTx = txTable.getLocalTransaction(localTxId);
   if (localTx == null) {
     throw new IllegalStateException("Local tx not found but present in the tx table!");
   }
   TransactionManager txManager = txManager();
   txManager.resume(localTx.getTransaction());
   if (commit) {
     txManager.commit();
   } else {
     txManager.rollback();
   }
 }
 protected boolean isTxFromRemoteSite(GlobalTransaction gtx) {
   LocalTransaction remoteTx = txTable.getLocalTransaction(gtx);
   return remoteTx != null && remoteTx.isFromRemoteSite();
 }