You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mp...@apache.org on 2006/09/16 02:44:58 UTC

svn commit: r446799 - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-kernel/src/main/java/org/apache/openjpa/conf/ openjpa-kernel/src/main/...

Author: mprudhom
Date: Fri Sep 15 17:44:55 2006
New Revision: 446799

URL: http://svn.apache.org/viewvc?view=rev&rev=446799
Log:
Non-optimistic transactions will no longer perform a version check when committing dirty objects, unless the NonOptimisticVersionCheck compatibility property is set to true. This allows dirty instances enlisted in a non-optimistic transaction to be allowed to overwrite conflicting versions in the database.

Modified:
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StateComparisonVersionStrategy.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java?view=diff&rev=446799&r1=446798&r2=446799
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java Fri Sep 15 17:44:55 2006
@@ -35,6 +35,7 @@
 import org.apache.openjpa.kernel.PCState;
 import org.apache.openjpa.lib.conf.Configurable;
 import org.apache.openjpa.lib.conf.Configuration;
+import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.OpenJPAException;
 import org.apache.openjpa.util.OptimisticException;
 
@@ -139,6 +140,8 @@
         RowManager rowMgr, JDBCStore store, Collection exceps,
         Collection customs) {
         try {
+            BitSet dirty;
+
             if (sm.getPCState() == PCState.PNEW && !sm.isFlushed()) {
                 insert(sm, (ClassMapping) sm.getMetaData(), rowMgr, store,
                     customs);
@@ -146,18 +149,9 @@
                 || sm.getPCState() == PCState.PDELETED) {
                 delete(sm, (ClassMapping) sm.getMetaData(), rowMgr, store,
                     customs);
-            } else if ((sm.getPCState() == PCState.PDIRTY && (!sm.isFlushed() || sm
-                .isFlushedDirty()))
-                || (sm.getPCState() == PCState.PNEW && sm.isFlushedDirty())) {
-                BitSet dirty = sm.getDirty();
-                if (sm.isFlushed()) {
-                    dirty = (BitSet) dirty.clone();
-                    dirty.andNot(sm.getFlushed());
-                }
-
-                if (dirty.length() > 0)
-                    update(sm, dirty, (ClassMapping) sm.getMetaData(), rowMgr,
-                        store, customs);
+            } else if ((dirty = ImplHelper.getUpdateFields(sm)) != null) {
+                update(sm, dirty, (ClassMapping) sm.getMetaData(), rowMgr,
+                    store, customs);
             } else if (sm.isVersionUpdateRequired()) {
                 updateIndicators(sm, (ClassMapping) sm.getMetaData(), rowMgr,
                     store, customs, true);

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java?view=diff&rev=446799&r1=446798&r2=446799
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java Fri Sep 15 17:44:55 2006
@@ -138,7 +138,7 @@
 
         // set where and update conditions on row
         for (int i = 0; i < cols.length; i++) {
-            if (curVersion != null)
+            if (curVersion != null && sm.isVersionCheckRequired())
                 row.whereObject(cols[i], curVersion);
             if (vers.getColumnIO().isUpdatable(i, nextVersion == null))
                 row.setObject(cols[i], nextVersion);

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StateComparisonVersionStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StateComparisonVersionStrategy.java?view=diff&rev=446799&r1=446798&r2=446799
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StateComparisonVersionStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StateComparisonVersionStrategy.java Fri Sep 15 17:44:55 2006
@@ -101,28 +101,30 @@
         // db values match our previous image
         FieldMapping[] fields = (FieldMapping[]) sm.getMetaData().getFields();
         Row row;
-        for (int i = 0, max = loaded.length(); i < max; i++) {
-            if (!loaded.get(i))
-                continue;
+        if (sm.isVersionCheckRequired()) {
+            for (int i = 0, max = loaded.length(); i < max; i++) {
+                if (!loaded.get(i))
+                    continue;
 
-            // update our next state image with the new field value
-            if (sm.getDirty().get(i) && !sm.getFlushed().get(i))
-                nextState[i] = sm.fetch(fields[i].getIndex());
+                // update our next state image with the new field value
+                if (sm.getDirty().get(i) && !sm.getFlushed().get(i))
+                    nextState[i] = sm.fetch(fields[i].getIndex());
 
-            // fetch the row for this field; if no row exists, then we can't
-            // add one because we have no updates to perform; that means we
-            // won't detect OL exceptions when another transaction changes
-            // fields that aren't in any of the same tables as fields that
-            // this transaction changed
-            row = rm.getRow(fields[i].getTable(), Row.ACTION_UPDATE,
-                sm, false);
-            if (row == null)
-                continue;
+                // fetch the row for this field; if no row exists, then we can't
+                // add one because we have no updates to perform; that means we
+                // won't detect OL exceptions when another transaction changes
+                // fields that aren't in any of the same tables as fields that
+                // this transaction changed
+                row = rm.getRow(fields[i].getTable(), Row.ACTION_UPDATE,
+                    sm, false);
+                if (row == null)
+                    continue;
 
-            // set WHERE criteria matching the previous state image so the
-            // update will fail if any changes have been made by another trans
-            fields[i].where(sm, store, rm, state[i]);
-            row.setFailedObject(sm.getManagedInstance());
+                // set WHERE criteria matching the previous state image so the
+                // update will fail for any changes made by another transaction
+                fields[i].where(sm, store, rm, state[i]);
+                row.setFailedObject(sm.getManagedInstance());
+            }
         }
         sm.setNextVersion(nextState);
     }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java?view=diff&rev=446799&r1=446798&r2=446799
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java Fri Sep 15 17:44:55 2006
@@ -26,6 +26,7 @@
     private boolean _copyIds = false;
     private boolean _closeOnCommit = true;
     private boolean _quotedNumbers = false;
+    private boolean _nonOptimisticVersionCheck = false;
 
     /**
      * Whether to require exact identity value types when creating object
@@ -136,4 +137,24 @@
     public void setCloseOnManagedCommit(boolean close) {
         _closeOnCommit = close;
 	}	
+
+    /** 
+     * Whether or not to perform a version check on instances being updated
+     * in a datastore transaction. Version of OpenJPA prior to 4.1 always
+     * forced a version check.
+     */
+    public void setNonOptimisticVersionCheck
+        (boolean nonOptimisticVersionCheck) {
+        _nonOptimisticVersionCheck = nonOptimisticVersionCheck;
+    }
+
+    /** 
+     * Whether or not to perform a version check on instances being updated
+     * in a datastore transaction. Version of OpenJPA prior to 4.1 always
+     * forced a version check.
+     */
+    public boolean getNonOptimisticVersionCheck() {
+        return _nonOptimisticVersionCheck;
+    }
+
 }

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?view=diff&rev=446799&r1=446798&r2=446799
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java Fri Sep 15 17:44:55 2006
@@ -38,6 +38,7 @@
 import org.apache.openjpa.meta.ValueStrategies;
 import org.apache.openjpa.util.ApplicationIds;
 import org.apache.openjpa.util.Exceptions;
+import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.InternalException;
 import org.apache.openjpa.util.InvalidStateException;
 import org.apache.openjpa.util.ObjectNotFoundException;
@@ -2926,7 +2927,23 @@
      * Returns whether this instance needs a version check.
      */
     public boolean isVersionCheckRequired() {
-        return (_flags & FLAG_VERSION_CHECK) > 0;
+
+        // explicit flag for version check
+        if ((_flags & FLAG_VERSION_CHECK) > 0)
+            return true;
+
+        // need to check version if we have any dirty fields, unless we
+        // are in a datastore transaction
+        if (ImplHelper.getUpdateFields(this) != null) {
+            if (_broker.getOptimistic()) {
+                return true;
+            } else {
+                return _broker.getConfiguration().
+                    getCompatibilityInstance().getNonOptimisticVersionCheck();
+            }
+        }
+
+        return false;
     }
 
     /**

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java?view=diff&rev=446799&r1=446798&r2=446799
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ImplHelper.java Fri Sep 15 17:44:55 2006
@@ -17,6 +17,7 @@
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -164,6 +165,30 @@
             default:
                 return null;
         }
+    }
+
+    /** 
+     * Returns the fields of the state that require an update. 
+     *  
+     * @param  sm  the state to check
+     * @return the BitSet of fields that need update, or null if none
+     */
+    public static BitSet getUpdateFields(OpenJPAStateManager sm) {
+
+        if ((sm.getPCState() == PCState.PDIRTY
+            && (!sm.isFlushed() || sm.isFlushedDirty()))
+            || (sm.getPCState() == PCState.PNEW && sm.isFlushedDirty())) {
+            BitSet dirty = sm.getDirty();
+            if (sm.isFlushed()) {
+                dirty = (BitSet) dirty.clone();
+                dirty.andNot(sm.getFlushed());
+            }
+
+            if (dirty.length() > 0)
+                return dirty;
+        }
+
+        return null;
     }
 
     /**