View Javadoc

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 }