docs: void postInvoke(EJBKey key, TxCookieImpl cookie, EJBMethodInfoImpl methodInfo)
                      throws CSIException
      {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled()) { // d173022.3
              Tr.entry(tc, "postInvoke");
          }
  
          // Any local transaction which exists now was started in preInvoke
  
          if (cookie.beginner) {
              if (txCtrl.getRollbackOnly())
              {
                  // Before rolling back, first determine if the rollback was the
                  // result of the transaction timing out. If it did time out, then
                  // and exception needs to be thrown.                         PM63801
                  CSITransactionRolledbackException timeoutEx = null;
                  try
                  {
                      txCtrl.completeTxTimeout();
                  } catch (CSITransactionRolledbackException ex)
                  {
                      if (isTraceOn && tc.isDebugEnabled())
                          Tr.debug(tc, "tran timed out; will throw ex after rollback");
                      timeoutEx = ex;
                  }
  
                  rollback(true, key, methodInfo);
  
                  // Because of the asynchronous nature of timeouts, if the tran
                  // did timeout, then the timeout exception needs to be thrown
                  // regardless of the bean type or setRollbackOnly behavior
                  // setting. If the beginner did call setRollbackOnly(), then
                  // this exception may still be discarded later.              PM63801
                  if (timeoutEx != null)
                  {
                      if (isTraceOn && tc.isEntryEnabled())
                          Tr.exit(tc, "postInvoke : " + timeoutEx);
                      throw timeoutEx;
                  }
  
                  MethodInterface methodType = methodInfo.getInterfaceType();
  
                  // Transaction has been marked rollbackonly (due to either a
                  // timeout or call to setRollbackOnly), and has now been rolled
                  // back... so throw an exception to notify the client.
                  // Note: this will be caught and discarded if bean called
                  // setRollbackOnly().                                   d159491
                  // Note: Beginning with EJB 3.0 (CTS) it is required that the
                  // bean method return normally regardless of how the tx was
                  // marked for rollback, so don't throw the exception.   d461917
                  // Also, the exception needs to be thrown for MDBs and timer
                  // methods to let the messaging and scheduler services know
                  // that the method failed/rolledback.                   d470213
                  // Note:  We will now allow EJB 3.0 modules to have the old
                  // 2.x SetRollbackOnly behavior, and we will allow EJB 2.x
                  // modules to have the new 3.0 SetRollbackOnly behavior.
                  // EJB 3.x modules will exhibit the 2.x behavior if the
                  // application is listed in the com.ibm.websphere.ejbcontainer.
                  // limitSetRollbackOnlyBehaviorToInstanceFor property.
                  // Likewise, the EJB 2.x modules will exhibit the 3.x
                  // SetRollbackOnly behavior if the application is listed
                  // in the com.ibm.websphere.ejbcontainer.
                  // extendSetRollbackOnlyBehaviorBeyondInstanceFor property.
                  // These properties were analyzed when the EJBModuleMetaData
                  // was created and the "ivUseExtendedSetRollbackOnlyBehavior"
                  // was set.     //d461917.1
                  BeanMetaData bmd = methodInfo.getBeanMetaData();
                  EJBModuleMetaDataImpl mmd = bmd._moduleMetaData;
                  if (isTraceOn && tc.isDebugEnabled()) // d461917.1
                  {
                      Tr.debug(tc, "EJBModuleMetaDataImpl.ivUseExtendedSetRollbackOnlyBehavior = "
                                   + mmd.ivUseExtendedSetRollbackOnlyBehavior);
                  }
                  if (!mmd.ivUseExtendedSetRollbackOnlyBehavior ||
                      methodType == MESSAGE_LISTENER ||
                      methodType == TIMED_OBJECT)
                  {
                      if (isTraceOn && tc.isEntryEnabled())
                          Tr.exit(tc, "postInvoke : Transaction marked rollbackonly");
                      throw new CSITransactionRolledbackException("Transaction marked rollbackonly"); // LIDB1673.2.1.5
                  }
              }
              else
              {
                  commit(key, methodInfo);
              }
          }
          else //LIDB1673.2.1.5
          { //LIDB1673.2.1.5
              // Control point on application thread for effecting       //LIDB1673.2.1.5
              // rollback in the case of timeout                         //LIDB1673.2.1.5//d171654
              // conditions                                              //LIDB1673.2.1.5
              txCtrl.completeTxTimeout(); //LIDB1673.2.1.5
          } //LIDB1673.2.1.5
  
          if (isTraceOn && tc.isEntryEnabled()) { // d173022.3
              Tr.exit(tc, "postInvoke");
          }
      }