docs: public void start(Xid xid, int flags) throws XAException
     {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "start", new Object[]{xid, flags});
        
        // First have a check to see if this start is a resume.
        if ((flags & XAResource.TMRESUME) != 0)
        {
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "TMRESUME was specified");
           
           // Now look for the right XA Resource that is in our suspended XID map. If that is not
           // found then we can throw a XAER_NOTA return code
           BaseSIXAResourceProxy tx = suspendedTransactions.remove(xid);
           
           if (tx == null)
           {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "There was no XId in the map");
              
              throw new XAException(XAException.XAER_NOTA);
           }
           
           currentLiveXAResource = tx;
           currentLiveXAResource.isSuspended = false;
           currentLiveXAResource.setEnlisted(xid);
           
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Resumed: ", currentLiveXAResource);
        }
        // Otherwise we assume we are going to start a new transaction. The SIXAResource we use 
        // doesn't really matter but we make an attempt not to create any more that we need. Normally
        // we'll use 'this' unless we are suspended. In which case we'll use one from our 
        // useableSIXAResources list. If this is empty, we'll create a new one from the connection
        else
        {
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Starting a new transaction");
           
           // If the current useable XA resource is not null and is not suspended, then we do not 
           // need to do anything, we can simply use that.
           if (currentLiveXAResource != null && (!currentLiveXAResource.isSuspended))
           {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Using the current XAResource");
           }
           else
           {
              // If we are suspended, then have a look and see if there is an SIXAResource free in 
              // the useableXAResources list
              if (useableXAResources.size() != 0)
              {
                 if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Re-using an old SIXAResource");
                 currentLiveXAResource = useableXAResources.remove(0);
              }
              else
              {
                 // Nope - we must create a new one
                 if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Obtaining fresh XA Resource");
                 try
                 {
                    currentLiveXAResource = getConnectionProxy()._createXAResource(useMSResource);
                 }
                 catch (SIException e)
                 {
                    FFDCFilter.processException(e, CLASS_NAME + ".start", 
                                                CommsConstants.SUSPENDABLEXARESOURCE_START_01, this);
                    
                    if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Unable to obtain the XA Resource");
                    
                    // This is bad, rethrow as the worst XA Exception
                    XAException xa = new XAException(XAException.XAER_RMERR);
                    xa.initCause(e);
                    throw xa;
                 }
              }            
           }
           
           if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "Using: ", currentLiveXAResource);
           
           // Now call the relevant method on the right XA Resource
           currentLiveXAResource.start(xid, flags);
  
        }
  
        currentXid = xid;
        
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "start");
     }