code: private List applyOperationAndCheck(Operation op, MithraTransaction tx)
      {
          boolean oldEvaluationMode = tx.zIsInOperationEvaluationMode();
          List resultList = null;
          try
          {
              tx.zSetOperationEvaluationMode(true);
              if (this.isPureHome() || (!this.isOperationPartiallyCached(op) && !this.txParticipationRequired(tx, op)))
              {
                  resultList = this.resolveOperationOnCache(op);
              }
              else
              {
                  resultList = op.applyOperationToPartialCache();
                  if (resultList == null && !this.isOperationPartiallyCached(op) && this.getTxParticipationMode(tx).mustParticipateInTxOnRead())
                  {
                      // attempt to find what we have in cache to trigger waiting for potential other transactions
                      List untrustworthyResult = op.applyOperationToFullCache();
                      checkTransactionParticipationAndWaitForOtherTransactions(untrustworthyResult, tx);
                  }
                  resultList = checkTransactionParticipationAndWaitForOtherTransactions(resultList, tx);
              }
          }
          finally
          {
              tx.zSetOperationEvaluationMode(oldEvaluationMode);
          }
          if (this.isPureHome())
          {
              checkTransactionParticipationForPureObject(resultList, tx);
          }
          return resultList;
      }
docs: the transaction is getting 100% correct data