⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rowlocking3.java

📁 derby database source code.good for you.
💻 JAVA
字号:
/*   Derby - Class org.apache.derby.impl.store.raw.xact.RowLocking3   Copyright 1998, 2004 The Apache Software Foundation or its licensors, as applicable.   Licensed under the Apache License, Version 2.0 (the "License");   you may not use this file except in compliance with the License.   You may obtain a copy of the License at      http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License. */package org.apache.derby.impl.store.raw.xact;import org.apache.derby.iapi.services.locks.LockFactory;import org.apache.derby.iapi.services.locks.C_LockFactory;import org.apache.derby.iapi.services.locks.Latch;import org.apache.derby.iapi.services.sanity.SanityManager;import org.apache.derby.iapi.store.raw.ContainerHandle;import org.apache.derby.iapi.store.raw.ContainerLock;import org.apache.derby.iapi.store.raw.RecordHandle;import org.apache.derby.iapi.store.raw.RowLock;import org.apache.derby.iapi.store.raw.Transaction;import org.apache.derby.iapi.store.raw.LockingPolicy;import org.apache.derby.iapi.error.StandardException;/**	A locking policy that implements row level locking with isolation degree 3.	@see org.apache.derby.iapi.store.raw.LockingPolicy*/public class RowLocking3 extends NoLocking {	// no locking has no state, so it's safe to hold	// it as a static	private static final LockingPolicy NO_LOCK = new NoLocking();	protected final LockFactory	lf;	protected RowLocking3(LockFactory lf)     {		this.lf = lf;	}    /**     * Get type of lock to get while reading data.     * <p>     * This routine is provided so that class's like RowLockingRR can     * override just this routine to get RS2 locks vs RS3 locks, and still     * reuse all the other code in this class.     * <p>     *	 * @return The lock type of a shared lock for this locking policy.     **/	protected RowLock getReadLockType()     {		return(RowLock.RS3);    }    /**     * Get type of lock to get while requesting "update" lock.     * <p>     * This routine is provided so that class's like RowLockingRR can     * override just this routine to get RU2 locks vs RU3 locks, and still     * reuse all the other code in this class.     * <p>     *	 * @return The lock type of a shared lock for this locking policy.     **/	protected RowLock getUpdateLockType()     {		return(RowLock.RU3);    }    /**     * Get type of lock to get while writing data.     * <p>     * This routine is provided so that class's like RowLockingRR can     * override just this routine to get RX2 locks vs RX3 locks, and still     * reuse all the other code in this class.     * <p>     *	 * @return The lock type of a shared lock for this locking policy.     **/	protected RowLock getWriteLockType()     {		return(RowLock.RX3);    }    /**     * Obtain container level intent lock.     * <p>     * This implementation of row locking is 2 level, ie. table and row locking.     * It will interact correctly with tables opened with ContainerLocking3     * locking mode.     * <p>     * Updater's will get table level IX locks, and X row locks.     * <p>     * Reader's will get table level IS locks, and S row locks.     *     * @param t            Transaction to associate lock with.     * @param container    Container to lock.     * @param waitForLock  Should lock request wait until granted?     * @param forUpdate    Should container be locked for update, or read?     *     * @return true if the lock was obtained, false if it wasn't.      *   False should only be returned if the waitForLock policy was set to     *  "false," and the lock was unavailable.     *	 * @exception  StandardException  Standard exception policy.     **/	public boolean lockContainer(    Transaction         t,     ContainerHandle     container,     boolean             waitForLock,    boolean             forUpdate)		throws StandardException     {		Object qualifier = forUpdate ? ContainerLock.CIX : ContainerLock.CIS;		boolean gotLock =             lf.lockObject(                t.getCompatibilitySpace(), t, container.getId(), qualifier,                waitForLock ? C_LockFactory.TIMED_WAIT : C_LockFactory.NO_WAIT);		if (gotLock) {			// look for covering table locks			// CIS is covered by CX or CS			// CIX is covered by CX			if (lf.isLockHeld(t.getCompatibilitySpace(), t, container.getId(), ContainerLock.CX) ||				((!forUpdate) && lf.isLockHeld(t.getCompatibilitySpace(), t, container.getId(), ContainerLock.CS))) {				container.setLockingPolicy(NO_LOCK);			}		}		return gotLock;	}    /**     * Obtain lock on record being read.     * <p>     * Assumes that a table level IS has been acquired.  Will acquire a Shared     * or Update lock on the row, depending on the "forUpdate" parameter.     * <p>     *     * @param t             The transaction to associate the lock with.     * @param record        The record to be locked.     * @param waitForLock   Should lock request wait until granted?     * @param forUpdate     Whether to open for read or write access.     *     * @return true if the lock was granted, false if waitForLock was false      *              and the lock could not be granted.     *	 * @exception  StandardException  Standard exception policy.     **/	public boolean lockRecordForRead(    Transaction     t,     ContainerHandle container_handle,    RecordHandle    record,     boolean         waitForLock,    boolean         forUpdate)		throws StandardException	{        // RESOLVE - Did I do the right thing with the "forUpdate" variable.        // For now just lock the row in Shared mode.		Object qualifier = forUpdate ? getUpdateLockType() : getReadLockType();        return(            lf.lockObject(                t.getCompatibilitySpace(), t, record, qualifier,                waitForLock ?                     C_LockFactory.TIMED_WAIT : C_LockFactory.NO_WAIT));	}    /**     * Obtain lock on record being read while holding a latch.     * <p>     * Assumes that a table level IS has been acquired.  Will acquire a Shared     * or Update lock on the row, depending on the "forUpdate" parameter.     * <p>     *     * @param latch         The latch being held.     * @param record        The record to be locked.     * @param forUpdate     Whether to open for read or write access.     *	 * @exception  StandardException  Standard exception policy.     **/	public void lockRecordForRead(    Latch			latch,     RecordHandle    record,     boolean         forUpdate)		throws StandardException	{        // RESOLVE - Did I do the right thing with the "forUpdate" variable.        // For now just lock the row in Shared mode.		Object qualifier = forUpdate ? getUpdateLockType() : getReadLockType();        lf.lockObject(            latch.getCompatabilitySpace(), record, qualifier,             C_LockFactory.TIMED_WAIT, latch);	}    /**     * Obtain lock on record being written.     * <p>     * Assumes that a table level IX has been acquired.  Will acquire an     * Exclusive (X) lock on the row.     * <p>     *     * @param t                        transaction to associate the lock with.     * @param record                   The record to be locked.     * @param lockForInsertPreviousKey Lock is for a previous key of a insert.     * @param waitForLock              Should lock request wait until granted?     *     * @return true if the lock was granted, false if waitForLock was false      *              and the lock could not be granted.     *	 * @exception  StandardException  Standard exception policy.     **/	public boolean zeroDurationLockRecordForWrite(    Transaction     t,     RecordHandle    record,    boolean         lockForInsertPreviousKey,    boolean         waitForLock)		throws StandardException	{        return(lf.zeroDurationlockObject(                t.getCompatibilitySpace(), record,                 (lockForInsertPreviousKey ? RowLock.RIP : getWriteLockType()),                waitForLock ? C_LockFactory.TIMED_WAIT : C_LockFactory.NO_WAIT));	}    /**     * Obtain lock on record being written.     * <p>     * Assumes that a table level IX has been acquired.  Will acquire an     * Exclusive (X) lock on the row.     * <p>     *     * @param t             The transaction to associate the lock with.     * @param record        The record to be locked.     * @param lockForInsert Lock is for an insert.     * @param waitForLock   Should lock request wait until granted?     *     * @return true if the lock was granted, false if waitForLock was false      *              and the lock could not be granted.     *	 * @exception  StandardException  Standard exception policy.     **/	public boolean lockRecordForWrite(    Transaction     t,     RecordHandle    record,    boolean         lockForInsert,    boolean         waitForLock)		throws StandardException	{        return(lf.lockObject(            t.getCompatibilitySpace(), t, record,             lockForInsert ? RowLock.RI : getWriteLockType(),            waitForLock   ? C_LockFactory.TIMED_WAIT : C_LockFactory.NO_WAIT));	}    /**     * Obtain lock on record being written while holding a latch.     * <p>     * Assumes that a table level IX has been acquired.  Will acquire an     * Exclusive (X) lock on the row.     * <p>     *     * @param latch         The latch being held     * @param record        The record to be locked.     *	 * @exception  StandardException  Standard exception policy.     **/	public void lockRecordForWrite(    Latch		    latch,     RecordHandle    record)		throws StandardException	{        lf.lockObject(            latch.getCompatabilitySpace(),             record,             getWriteLockType(),            C_LockFactory.TIMED_WAIT,             latch);	}	public int getMode() {		return MODE_RECORD;	}	/*	** We can inherit all the others methods of NoLocking since we hold the     ** container lock and row locks until the end of transaction.	*/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -