Coverage Report - org.apache.ojb.odmg.locking.ReadCommittedStrategy
 
Classes in this File Line Coverage Branch Coverage Complexity
ReadCommittedStrategy
N/A
N/A
6.167
 
 1  
 package org.apache.ojb.odmg.locking;
 2  
 
 3  
 /* Copyright 2002-2005 The Apache Software Foundation
 4  
  *
 5  
  * Licensed under the Apache License, Version 2.0 (the "License");
 6  
  * you may not use this file except in compliance with the License.
 7  
  * You may obtain a copy of the License at
 8  
  *
 9  
  *     http://www.apache.org/licenses/LICENSE-2.0
 10  
  *
 11  
  * Unless required by applicable law or agreed to in writing, software
 12  
  * distributed under the License is distributed on an "AS IS" BASIS,
 13  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  * See the License for the specific language governing permissions and
 15  
  * limitations under the License.
 16  
  */
 17  
 
 18  
 import org.apache.ojb.odmg.TransactionImpl;
 19  
 
 20  
 /**
 21  
  * The implementation of the Commited Reads Locking stra
 22  
  * ReadCommitted - Reads and Writes require locks.
 23  
  *
 24  
  * Locks are acquired for reading and modifying the database.
 25  
  * Locks are released after reading but locks on modified objects
 26  
  * are held until EOT.
 27  
  *
 28  
  * Allows:
 29  
  * Non-Repeatable Reads
 30  
  * Phantom Readstegy.
 31  
  *
 32  
  * @author Thomas Mahler & David Dixon-Peugh
 33  
  */
 34  
 public class ReadCommittedStrategy extends AbstractLockStrategy
 35  
 {
 36  
 
 37  
     /**
 38  
      * acquire a read lock on Object obj for Transaction tx.
 39  
      * @param tx the transaction requesting the lock
 40  
      * @param obj the Object to be locked
 41  
      * @return true if successful, else false
 42  
      *
 43  
      */
 44  
     public boolean readLock(TransactionImpl tx, Object obj)
 45  
     {
 46  
 
 47  
         LockEntry writer = getWriter(obj);
 48  
         if (writer == null)
 49  
         {
 50  
             addReader(tx, obj);
 51  
             // if there has been a successful write locking, try again
 52  
             if (getWriter(obj) == null)
 53  
                 return true;
 54  
             else
 55  
             {
 56  
                 removeReader(tx, obj);
 57  
                 return readLock(tx, obj);
 58  
             }
 59  
         }
 60  
         if (writer.isOwnedBy(tx))
 61  
         {
 62  
             return true;    // If I'm the writer, I can read.
 63  
         }
 64  
         else
 65  
         {
 66  
             return false;
 67  
         }
 68  
     }
 69  
 
 70  
     /**
 71  
      * acquire a write lock on Object obj for Transaction tx.
 72  
      * @param tx the transaction requesting the lock
 73  
      * @param obj the Object to be locked
 74  
      * @return true if successful, else false
 75  
      *
 76  
      */
 77  
     public boolean writeLock(TransactionImpl tx, Object obj)
 78  
     {
 79  
         LockEntry writer = getWriter(obj);
 80  
         // if there is no writer yet we can try to get the global write lock
 81  
         if (writer == null)
 82  
         {
 83  
             // if lock could be acquired return true
 84  
             if (setWriter(tx, obj))
 85  
                 return true;
 86  
             // else try again
 87  
             else
 88  
                 return writeLock(tx, obj);
 89  
         }
 90  
         if (writer.isOwnedBy(tx))
 91  
         {
 92  
             return true;    // If I'm the writer, then I can write.
 93  
         }
 94  
 
 95  
         return false;
 96  
     }
 97  
 
 98  
     /**
 99  
      * acquire a lock upgrade (from read to write) lock on Object obj for Transaction tx.
 100  
      * @param tx the transaction requesting the lock
 101  
      * @param obj the Object to be locked
 102  
      * @return true if successful, else false
 103  
      *
 104  
      */
 105  
     public boolean upgradeLock(TransactionImpl tx, Object obj)
 106  
     {
 107  
         LockEntry writer = getWriter(obj);
 108  
         if (writer == null)
 109  
         {
 110  
             // if lock could be acquired return true
 111  
             if (setWriter(tx, obj))
 112  
                 return true;
 113  
             // else try again
 114  
             else
 115  
                 return upgradeLock(tx, obj);
 116  
         }
 117  
         if (writer.isOwnedBy(tx))
 118  
         {
 119  
             return true;    // If I already have Write, then I've upgraded.
 120  
         }
 121  
 
 122  
         return false;
 123  
     }
 124  
 
 125  
     /**
 126  
      * release a lock on Object obj for Transaction tx.
 127  
      * @param tx the transaction releasing the lock
 128  
      * @param obj the Object to be unlocked
 129  
      * @return true if successful, else false
 130  
      *
 131  
      */
 132  
     public boolean releaseLock(TransactionImpl tx, Object obj)
 133  
     {
 134  
         LockEntry writer = getWriter(obj);
 135  
 
 136  
         if (writer != null && writer.isOwnedBy(tx))
 137  
         {
 138  
             removeWriter(writer);
 139  
             return true;
 140  
         }
 141  
 
 142  
         if (hasReadLock(tx, obj))
 143  
         {
 144  
             removeReader(tx, obj);
 145  
             return true;
 146  
         }
 147  
         return false;
 148  
     }
 149  
 
 150  
     /**
 151  
      * checks whether the specified Object obj is read-locked by Transaction tx.
 152  
      * @param tx the transaction
 153  
      * @param obj the Object to be checked
 154  
      * @return true if lock exists, else false
 155  
      */
 156  
     public boolean checkRead(TransactionImpl tx, Object obj)
 157  
     {
 158  
         if (hasReadLock(tx, obj))
 159  
         {
 160  
             return true;
 161  
         }
 162  
         LockEntry writer = getWriter(obj);
 163  
         if (writer.isOwnedBy(tx))
 164  
         {
 165  
             return true;
 166  
         }
 167  
         return false;
 168  
     }
 169  
 
 170  
     /**
 171  
      * checks whether the specified Object obj is write-locked by Transaction tx.
 172  
      * @param tx the transaction
 173  
      * @param obj the Object to be checked
 174  
      * @return true if lock exists, else false
 175  
      */
 176  
     public boolean checkWrite(TransactionImpl tx, Object obj)
 177  
     {
 178  
         LockEntry writer = getWriter(obj);
 179  
         if (writer == null)
 180  
             return false;
 181  
         else if (writer.isOwnedBy(tx))
 182  
             return true;
 183  
         else
 184  
             return false;
 185  
     }
 186  
 }