code: void releaseAll(long txNum, boolean sLockOnly) {
  		Set<Object> objectsToRelease = getObjectSet(txNum);
  		for (Object obj : objectsToRelease) {
  			Object anchor = getAnchor(obj);
  			synchronized (anchor) {
  				Lockers lks = lockerMap.get(obj);
  
  				if (lks != null) {
  
  					if (hasSLock(lks, txNum))
  						releaseLock(lks, anchor, txNum, S_LOCK);
  
  					if (hasXLock(lks, txNum) && !sLockOnly)
  						releaseLock(lks, anchor, txNum, X_LOCK);
  
  					if (hasSixLock(lks, txNum))
  						releaseLock(lks, anchor, txNum, SIX_LOCK);
  
  					while (hasIsLock(lks, txNum))
  						releaseLock(lks, anchor, txNum, IS_LOCK);
  
  					while (hasIxLock(lks, txNum) && !sLockOnly)
  						releaseLock(lks, anchor, txNum, IX_LOCK);
  
  					// Remove the locker, if there is no other transaction
  					// having it
  					if (!sLocked(lks) && !xLocked(lks) && !sixLocked(lks)
  							&& !isLocked(lks) && !ixLocked(lks)
  							&& lks.requestSet.isEmpty())
  						lockerMap.remove(obj);
  				}
  			}
  		}
  		txWaitMap.remove(txNum);
  		txnsToBeAborted.remove(txNum);
  		lockByMap.remove(txNum);
  	}
docs: Releases all locks held by a transaction. If a lock is the last lock on
  that block, then the waiting transactions are notified.
  
  @param txNum
  a transaction number
  
  @param sLockOnly
  release slocks only