code: final void cmdPersistLock(final PersistentTransaction transaction) throws SevereMessageStoreException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "cmdPersistLock", new Object[] { "Item Link:   " + this, "Stream Link: " + _owningStreamLink, "Transaction: " + transaction });
  
          if (null != transaction)
          {
              boolean hasBecomeNonReleasable = false;
              synchronized (this)
              {
                  if (ItemLinkState.STATE_LOCKED == _itemLinkState)
                  {
                      _transactionId = transaction.getPersistentTranId();
                      hasBecomeNonReleasable = _declareNotDiscardable(_getAndAssertItem());
                      _itemLinkState = ItemLinkState.STATE_PERSISTING_LOCK;
                  }
                  else
                  {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEventEnabled())
                          SibTr.event(this, tc, "Invalid Item state: " + _itemLinkState);
                      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                          SibTr.exit(this, tc, "cmdPersistLock");
                      throw new StateException(_itemLinkState.toString());
                  }
              }
              if (hasBecomeNonReleasable)
              {
                  _declareNotReleasable();
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "cmdPersistLock");
      }
docs: /*
  Use this to lock persistently. Invoke indirectly by the API.
  
  @param transaction