openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From KAWANAKA Shinya <mayahjp...@mayah.jp>
Subject Re: Optimistic lock problem
Date Wed, 02 Mar 2011 17:54:15 GMT
Rick,

Thanks, the problem seemed fixed, another problem occurred though (fortunately it seems tractable.)

I know the dynamic enhancement is kind of buggy, however it was convenient when developing.
Because I have not encountered bugs, I have continued using it.
If some one has what may happen when using dynamic enhancing, let me know it. Thanks.


On Mar 3, 2011, at 02:25 , Rick Curtis wrote:

> Kawanaka -
> 
> I'm pretty certain this has to do with setting RuntimeUnenhancedClasses to
> supported. Don't do that.
> 
> Please configure build time enhancement, or the javaagent[1].
> 
> [1] http://openjpa.apache.org/runtime-enhancement.html
> 
> Thanks,
> Rick
> 
> On Wed, Mar 2, 2011 at 11:20 AM, KAWANAKA Shinya <mayahjp+ml@mayah.jp>wrote:
> 
>> Rick,
>> 
>> I used runtime enhancement at that time. The below is extracted from my
>> persistence.xml (password etc. are omitted.)
>> # DataCache and QueryCache are off here, but I tried all the possibilities.
>> 
>> 
>> 
>> <persistence-unit name="postgres">
>> 
>> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
>> 
>>  <class>entity.Questionnaire</class>
>> 
>>  <properties>
>>    <property name="openjpa.ConnectionDriverName"
>> value="org.apache.commons.dbcp.BasicDataSource"/>
>>    <property name="openjpa.ConnectionProperties"
>> value="DriverClassName=org.postgresql.Driver,Url=jdbc:postgresql:omitted,Username=omitted,Password=omitted"/>
>>    <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO"/>
>> 
>>    <property name="openjpa.jdbc.DBDictionary" value="postgres" />
>> 
>>    <property name="openjpa.jdbc.SynchronizeMappings"
>> value="buildSchema(SchemaAction='drop,add')" />
>>    <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
>> 
>>    <property name="openjpa.DataCache" value="false"/>
>>    <property name="openjpa.QueryCache" value="false"/>
>>    <property name="openjpa.RemoteCommitProvider" value="sjvm"/>
>>  </properties>
>> 
>> </persistence-unit>
>> 
>> 
>> On Mar 3, 2011, at 02:11 , Rick Curtis wrote:
>> 
>>> Kawanaka -
>>> 
>>> I'm going to start with my typical first question.... How are you
>> enhancing
>>> your Entities? Can you post the contents of your persistence.xml file?
>>> 
>>> Thanks,
>>> Rick
>>> 
>>> On Wed, Mar 2, 2011 at 10:31 AM, KAWANAKA Shinya <mayahjp+ml@mayah.jp
>>> wrote:
>>> 
>>>> Hi list,
>>>> 
>>>> I encountered the weird situation that an optimistic lock violation
>>>> happened. I would like you to judge this is my fault or a bug.
>>>> 
>>>> First I created an entity listed on here (
>> https://gist.github.com/851075).
>>>> Then I wrote several tests that used the entity. In the following test,
>> an
>>>> optimistic lock violation happened.
>>>> 
>>>> === CODE STARTS HERE ===
>>>>      EntityManager em = emf.createEntityManager();
>>>>      {
>>>>          em.getTransaction().begin();
>>>>          for (int i = 0; i < 10; ++i) {
>>>>              Questionnaire q = new Questionnaire("id" + i, "eventId",
>>>> "question", i, "answerText");
>>>>              em.persist(q);
>>>>          }
>>>>          // em.flush(); // (1)
>>>>          em.getTransaction().commit();
>>>>      }
>>>> 
>>>>      {
>>>>          em.getTransaction().begin();
>>>>          // em.flush(); // (3)
>>>>          Query q = em.createQuery("DELETE FROM Questionnaires t");
>>>>          q.executeUpdate();
>>>>          em.getTransaction().commit(); // (2)
>>>>      }
>>>> 
>>>>      em.close();
>>>> === CODE END HERE ===
>>>> 
>>>> In (2) the exception happened. The stack trace is attached at the last.
>>>> When I changed the field type of 'questionNo' to Integer (int ->
>> Integer),
>>>> the violation did not happen.
>>>> 
>>>> Some one advised me to use flush() at (1), but it did not help.
>>>> 
>>>> When I added (3) and traced the function, I found that
>>>> ImplHelper.getUpdateField(sm) in
>> AbstractUpdateManager#populateRowManager
>>>> returned a dirty flag that said the 'questionNo' was dirty.
>>>> 
>>>> === CODE HERE ===
>>>>          } else if ((dirty = ImplHelper.getUpdateFields(sm)) != null) {
>>>>              update(sm, dirty, (ClassMapping) sm.getMetaData(), rowMgr,
>>>>                  store, customs, false);
>>>> === END ===
>>>> 
>>>> I only used a single thread, so I don't think the entities were changed
>> in
>>>> the other threads. (Remember that the field type of 'questionNo' was
>> changed
>>>> to Integer, the code worked.)
>>>> 
>>>> Does anyone know why the violation happens?
>>>> 
>>>> My environment is
>>>> Mac OS X Snow leopard, Sun Java 6, and OpenJPA-2.0.1.
>>>> 
>>>> 
>>>> 
>>>> Exception in thread "main" <openjpa-2.0.1-r422266:989424 fatal store
>> error>
>>>> org.apache.openjpa.persistence.RollbackException: Optimistic locking
>> errors
>>>> were detected when flushing to the data store.  The following objects
>> may
>>>> have been concurrently modified in another transaction:
>>>> [entity.Questionnaire-id3, entity.Questionnaire-id1,
>>>> entity.Questionnaire-id5, entity.Questionnaire-id2,
>>>> entity.Questionnaire-id6, entity.Questionnaire-id0,
>>>> entity.Questionnaire-id8, entity.Questionnaire-id9,
>>>> entity.Questionnaire-id4, entity.Questionnaire-id7]
>>>>      at
>>>> 
>> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:584)
>>>>      at client.Test.run(Test.java:44)
>>>>      at client.Test.main(Test.java:17)
>>>> Caused by: <openjpa-2.0.1-r422266:989424 nonfatal store error>
>>>> org.apache.openjpa.persistence.OptimisticLockException: Optimistic
>> locking
>>>> errors were detected when flushing to the data store.  The following
>> objects
>>>> may have been concurrently modified in another transaction:
>>>> [entity.Questionnaire-id3, entity.Questionnaire-id1,
>>>> entity.Questionnaire-id5, entity.Questionnaire-id2,
>>>> entity.Questionnaire-id6, entity.Questionnaire-id0,
>>>> entity.Questionnaire-id8, entity.Questionnaire-id9,
>>>> entity.Questionnaire-id4, entity.Questionnaire-id7]
>>>>      at
>>>> 
>> org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2291)
>>>>      at
>> org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2139)
>>>>      at
>>>> org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2037)
>>>>      at
>>>> 
>> org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1955)
>>>>      at
>>>> 
>> org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
>>>>      at
>> org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1479)
>>>>      at
>>>> 
>> org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:925)
>>>>      at
>>>> 
>> org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:560)
>>>>      ... 2 more
>>>> Caused by: <openjpa-2.0.1-r422266:989424 nonfatal store error>
>>>> org.apache.openjpa.persistence.OptimisticLockException: An optimistic
>> lock
>>>> violation was detected when flushing object instance
>>>> "entity.Questionnaire-id3" to the data store.  This indicates that the
>>>> object was concurrently modified in another transaction.
>>>> FailedObject: entity.Questionnaire@72940b84
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:123)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:81)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:99)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:87)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:550)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:107)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:103)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
>>>>      at
>>>> 
>> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:731)
>>>>      at
>>>> 
>> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
>>>>      ... 9 more
>>>> 
>>>> 
>>>> --
>>>> Kawanaka Shinya <mayahjp+ml@mayah.jp>
>>>> http://mayah.jp/
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>> 
>> --
>> Kawanaka Shinya <mayahjp+ml@mayah.jp>
>> http://mayah.jp/
>> 
>> 
>> 
>> 
>> 
>> 

-- 
Kawanaka Shinya <mayahjp+ml@mayah.jp>
http://mayah.jp/





Mime
View raw message