You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ma...@apache.org on 2003/02/12 07:11:16 UTC
cvs commit: db-ojb/src/java/org/apache/ojb/odmg ObjectEnvelopeTable.java
mattbaird 2003/02/11 22:11:16
Modified: src/java/org/apache/ojb/odmg ObjectEnvelopeTable.java
Log:
fix OJB130. If an object is already locked for write, we might miss committing it if the implicitLocks is off
Revision Changes Path
1.17 +35 -7 db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelopeTable.java
Index: ObjectEnvelopeTable.java
===================================================================
RCS file: /home/cvs//db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelopeTable.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- ObjectEnvelopeTable.java 1 Feb 2003 15:40:05 -0000 1.16
+++ ObjectEnvelopeTable.java 12 Feb 2003 06:11:16 -0000 1.17
@@ -76,6 +76,8 @@
import org.apache.ojb.broker.util.ArrayIterator;
import org.apache.ojb.broker.util.logging.Logger;
import org.apache.ojb.broker.util.logging.LoggerFactory;
+import org.apache.ojb.odmg.locking.LockManager;
+import org.apache.ojb.odmg.locking.LockManagerFactory;
import org.odmg.Transaction;
import org.odmg.TransactionAbortedException;
@@ -242,14 +244,40 @@
// but only if it has not been marked during tx already !!
if ((!mod.needsDelete()) && (!mod.needsInsert()) && (!mod.needsUpdate()))
{
- if (useImplicitLocking && mod.hasChanged())
+ /**
+ * second check is, has the object in the envelope changed.
+ */
+ if (mod.hasChanged())
{
- // implicitely acquire a write lock !
- transaction.lock(mod.getObject(), Transaction.UPGRADE);
- // mark object dirty
- mod.setModificationState(mod.getModificationState().markDirty());
- // objects needs commit action, thus set needCommit to true:
- needsCommit = true;
+ /**
+ * now, the quickest thing to check is the useImplicitLocking flag. If we are using
+ * implicit locking, let's try to upgrade the lock, and mark the needsCommit
+ */
+ if (useImplicitLocking)
+ {
+ // implicitely acquire a write lock !
+ transaction.lock(mod.getObject(), Transaction.UPGRADE);
+ // objects needs commit action, thus set needCommit to true:
+ needsCommit = true;
+ }
+ /**
+ * If useImplicitLocking is false, we still need to check if the object in the envelope
+ * is write locked. If it is, we don't have to upgrade the lock, just mark needsCommit
+ */
+ else if (LockManagerFactory.getLockManager().checkWrite(transaction, mod.getObject()))
+ {
+ // objects needs commit action, thus set needCommit to true:
+ needsCommit = true;
+ }
+ /**
+ * now the needsCommit flag can be used to set the modification state on the
+ * object in the envelope.
+ */
+ if (needsCommit)
+ {
+ // mark object dirty
+ mod.setModificationState(mod.getModificationState().markDirty());
+ }
}
}
else