001    package org.odmg;
002    
003    
004    
005    /**
006    
007     * This interfaces provides the operations necessary to perform database transactions.
008    
009     * All access, creation, and modification of persistent objects and their fields
010    
011     * must be done within a transaction. Before performing any database operations,
012    
013     * a thread must explicitly create a transaction object or associate itself with
014    
015     * an existing transaction object (by calling <code>join</code>),
016    
017     * and that transaction must be open (through a call to <code>begin</code>).
018    
019     * All subsequent operations by the thread, including reads, writes, and lock
020    
021     * acquisitions, are done under the thread�s current transaction.
022    
023     * <p>
024    
025     * A thread may only operate on its current transaction. For example,
026    
027     * a <code>TransactionNotInProgressException</code> is thrown if a thread attempts
028    
029     * to begin, commit, checkpoint, or abort a transaction prior to joining itself
030    
031     * to that transaction.
032    
033     * <p>
034    
035     * A transaction is either <i>open</i> or <i>closed</i>. A transaction is open if a call
036    
037     * has been made to <code>begin</code>, but no call has been made to <code>commit</code> or
038    
039     * <code>abort</code>. Once <code>commit</code> or <code>abort</code> is called,
040    
041     * the transaction is closed. The method <code>isOpen</code> can be called to
042    
043     * determine the state of the transaction.
044    
045     * <p>
046    
047     * Read locks are implicitly obtained on objects as they are accessed.
048    
049     * Write locks are implicitly obtained as objects are modified.
050    
051     * <code>Transaction</code> objects are transient, they cannot be stored in the database.
052    
053     * @author      David Jordan (as Java Editor of the Object Data Management Group)
054    
055     * @version ODMG 3.0
056    
057     * @see TransactionNotInProgressException
058    
059     */
060    
061    
062    
063    public interface Transaction
064    
065    {
066    
067        /**
068    
069         * Attach the caller's thread to this <code>Transaction</code> and detach the thread
070    
071         * from any former <code>Transaction</code> the thread may have been associated with.
072    
073         */
074    
075        public void join();
076    
077    
078    
079        /**
080    
081         * Detach the caller's thread from this <code>Transaction</code>, but do not attach
082    
083         * the thread to another <code>Transaction</code>.
084    
085         */
086    
087        public void leave();
088    
089    
090    
091        /**
092    
093         * Start a transaction.
094    
095         * Calling <code>begin</code> multiple times on the same transaction object,
096    
097         * without an intervening call to <code>commit</code> or <code>abort</code>,
098    
099         * causes the exception <code>TransactionInProgressException</code> to be thrown
100    
101         * on the second and subsequent calls. Operations executed before a transaction
102    
103         * has been opened, or before reopening after a transaction is aborted or committed,
104    
105         * have undefined results;
106    
107         * these may throw a <code>TransactionNotInProgressException</code> exception.
108    
109         */
110    
111        public void begin();
112    
113    
114    
115        /**
116    
117         * Determine whether the transaction is open or not.
118    
119         * A transaction is open if a call has been made to <code>begin</code>,
120    
121         * but a subsequent call to either <code>commit</code> or <code>abort</code>
122    
123         * has not been made.
124    
125         * @return True if the transaction is open, otherwise false.
126    
127         */
128    
129        public boolean isOpen();
130    
131    
132    
133        /**
134    
135         * Commit and close the transaction.
136    
137         * Calling <code>commit</code> commits to the database all persistent object
138    
139         * modifications within the transaction and releases any locks held by the transaction.
140    
141         * A persistent object modification is an update of any field of an existing
142    
143         * persistent object, or an update or creation of a new named object in the database.
144    
145         * If a persistent object modification results in a reference from an existing
146    
147         * persistent object to a transient object, the transient object is moved to the
148    
149         * database, and all references to it updated accordingly. Note that the act of
150    
151         * moving a transient object to the database may create still more persistent
152    
153         * references to transient objects, so its referents must be examined and moved as well.
154    
155         * This process continues until the database contains no references to transient objects,
156    
157         * a condition that is guaranteed as part of transaction commit.
158    
159         * Committing a transaction does not remove from memory transient objects created
160    
161         * during the transaction
162    
163         */
164    
165        public void commit();
166    
167    
168    
169        /**
170    
171         * Abort and close the transaction.
172    
173         * Calling abort abandons all persistent object modifications and releases the
174    
175         * associated locks.
176    
177         * Aborting a transaction does not restore the state of modified transient objects
178    
179         */
180    
181        public void abort();
182    
183    
184    
185        /**
186    
187         * Commit the transaction, but reopen the transaction, retaining all locks.
188    
189         * Calling <code>checkpoint</code> commits persistent object modifications made
190    
191         * within the transaction since the last checkpoint to the database.
192    
193         * The transaction retains all locks it held on those objects at the time the
194    
195         * checkpoint was invoked.
196    
197         */
198    
199        public void checkpoint();
200    
201    
202    
203        /**
204    
205         * Read lock mode.
206    
207         */
208    
209        public static final int READ = 1;
210    
211    
212    
213        /**
214    
215         * Upgrade lock mode.
216    
217         */
218    
219        public static final int UPGRADE = 2;
220    
221    
222    
223        /**
224    
225         * Write lock mode.
226    
227         */
228    
229        public static final int WRITE = 4;
230    
231    
232    
233        /**
234    
235         * Upgrade the lock on the given object to the given lock mode.
236    
237         * The call has no effect if the object's current lock is already at or above
238    
239         * that level of lock mode.
240    
241         * @param   obj     The object to acquire a lock on.
242    
243         * @param   lockMode        The lock mode to acquire. The lock modes are <code>READ</code>,
244    
245         * <code>UPGRADE</code>, and <code>WRITE</code>.
246    
247         * @exception LockNotGrantedException       Is thrown if the given lock mode could not be acquired.
248    
249         */
250    
251        public void lock(Object obj, int lockMode)
252    
253                throws LockNotGrantedException;
254    
255    
256    
257        /**
258    
259         * Upgrade the lock on the given object to the given lock mode.
260    
261         * Method <code>tryLock</code> is the same as <code>lock</code> except it returns
262    
263         * a boolean indicating whether the lock was granted instead of generating an exception.
264    
265         * @param   obj     The object to acquire a lock on.
266    
267         * @param   lockMode        The lock mode to acquire. The lock modes are <code>READ</code>,
268    
269         * <code>UPGRADE</code>, and <code>WRITE</code>.
270    
271         * @return  True if the lock has been acquired, otherwise false.
272    
273         */
274    
275        public boolean tryLock(Object obj, int lockMode);
276    
277    
278    
279    }
280