code: void release(Object obj, long txNum, int lockType) {
  		Object anchor = getAnchor(obj);
  		synchronized (anchor) {
  			Lockers lks = lockerMap.get(obj);
  			/*
  			 * In some situation, tx will release the lock of the object that
  			 * have been released.
  			 */
  			if (lks != null) {
  				releaseLock(lks, anchor, txNum, lockType);
  
  				// Check if this transaction have any other lock on this object
  				if (!hasSLock(lks, txNum) && !hasXLock(lks, txNum)
  						&& !hasSixLock(lks, txNum) && !hasIsLock(lks, txNum)
  						&& !hasIxLock(lks, txNum)) {
  					getObjectSet(txNum).remove(obj);
  
  					// 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);
  				}
  			}
  		}
  	}
docs: Releases the specified type of lock on an item holding by a transaction.
  If a lock is the last lock on that block, then the waiting transactions
  are notified.
  
  @param obj
  a lockable item
  @param txNum
  a transaction number
  @param lockType
  the type of lock