docs: public final synchronized void notifyCompletion() {
          if (tc.isEntryEnabled())
              Tr.entry(tc, "notifyCompletion", "finishCount=" + _finishCount);
  
          if (--_finishCount < 0) {
              // may need to make final state transition here ?
              try {
                  switch (_status.getState()) {
                      case TransactionState.STATE_COMMITTING:
                      case TransactionState.STATE_HEURISTIC_ON_COMMIT:
                          _status.setState(TransactionState.STATE_COMMITTED);
                          break;
                      case TransactionState.STATE_ROLLING_BACK:
                      case TransactionState.STATE_HEURISTIC_ON_ROLLBACK:
                          _status.setState(TransactionState.STATE_ROLLED_BACK);
                          break;
  
                      // one phase commit that resulted in retries ...
                      case TransactionState.STATE_PREPARING:
                      case TransactionState.STATE_COMMITTING_ONE_PHASE:
                          _status.setState(TransactionState.STATE_COMMITTED);
                  } // end switch
              } catch (SystemException se) {
                  FFDCFilter.processException(se, "com.ibm.tx.jta.TransactionImpl.notifyCompletion", "2416", this);
                  if (tc.isDebugEnabled())
                      Tr.debug(tc, "SystemException setting state during completion processing", se);
                  // swallow this exception ... we're called in finally blocks!
              } finally {
                  forgetTransaction(true);
              }
          } // end if
          if (tc.isEntryEnabled())
              Tr.exit(tc, "notifyCompletion");
  
      }