the entity default use optimisticLock in my application;

but in some case i want's other transactions cannot concurrently read or
write the entity.

so i try to use pessimistic lock. is that right?

60 row : entityManager.lock(origin,LockModeType.PESSIMISTIC_WRITE);

public InputModule get(String id) {
        try {
                InputModule origin = entityManager.find(InputModule.class, id);
                if (null != origin) {
                        
entityManager.lock(origin,LockModeType.PESSIMISTIC_WRITE);
                        return origin;
                }
        } catch (Exception e) {
                logger.error("can't get InputModule instance" + id, e);
                ejbContext.setRollbackOnly();
        }
        return null;
}

but got error. how to lock a entity with pessmistic lock?
<openjpa-2.2.1.1-SNAPSHOT-r422266:1438134 nonfatal store error>
org.apache.openjpa.persistence.OptimisticLockException:
无法获取对象“com.plasticmummy.ufsc20.entity.module.InputModule-2770DEBEC95D4DAE8B1D4FBDEF358FB0”上的锁定,耗时
-1 毫秒。
FailedObject:
com.plasticmummy.ufsc20.entity.module.InputModule-2770DEBEC95D4DAE8B1D4FBDEF358FB0
        at
org.apache.openjpa.jdbc.kernel.PessimisticLockManager.checkLock(PessimisticLockManager.java:232)
        at
org.apache.openjpa.jdbc.kernel.PessimisticLockManager.lockRow(PessimisticLockManager.java:144)
        at
org.apache.openjpa.jdbc.kernel.PessimisticLockManager.lockInternal(PessimisticLockManager.java:109)
        at
org.apache.openjpa.jdbc.kernel.MixedLockManager.lockInternal(MixedLockManager.java:76)
        at
org.apache.openjpa.kernel.VersionLockManager.commonLock(VersionLockManager.java:95)
        at
org.apache.openjpa.kernel.VersionLockManager.lock(VersionLockManager.java:71)
        at org.apache.openjpa.kernel.BrokerImpl.lock(BrokerImpl.java:3885)
        at
org.apache.openjpa.kernel.DelegatingBroker.lock(DelegatingBroker.java:1305)
        at
org.apache.openjpa.persistence.EntityManagerImpl.lock(EntityManagerImpl.java:1206)
        at
org.apache.openjpa.persistence.EntityManagerImpl.lock(EntityManagerImpl.java:1191)
        at
com.ibm.ws.jpa.management.JPAExEmInvocation.lock(JPAExEmInvocation.java:293)
        at
com.ibm.ws.jpa.management.JPAEntityManager.lock(JPAEntityManager.java:260)
        at
com.plasticmummy.ufsc20.service.module.InputModuleService.get(InputModuleService.java:60)
        at
com.plasticmummy.ufsc20.service.module.EJSLocalNSLInputModuleService_5cd28e4b.get(EJSLocalNSLInputModuleService_5cd28e4b.java)
        at
com.plasticmummy.ufsc20.scratchpad.timer.TestTimer1.automaticTimeout(TestTimer1.java:22)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
        at java.lang.reflect.Method.invoke(Method.java:611)
        at
com.ibm.ejs.container.TimedObjectWrapper.invokeCallback(TimedObjectWrapper.java:129)
        at 
com.ibm.ejs.container.TimerNpListener.doWork(TimerNpListener.java:293)
        at
com.ibm.ejs.container.TimerNpListener.doWorkWithRetries(TimerNpListener.java:171)
        at com.ibm.ejs.container.TimerNpListener.fired(TimerNpListener.java:141)
        at 
com.ibm.ws.asynchbeans.AlarmImpl.callListenerMethod(AlarmImpl.java:427)
        at com.ibm.ws.asynchbeans.timer.GenericTimer.run(GenericTimer.java:228)
        at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1178)
        at 
com.ibm.ws.asynchbeans.AlarmImpl.runListenerAsCJWork(AlarmImpl.java:249)
        at com.ibm.ws.asynchbeans.am._Alarm.fireAlarm(_Alarm.java:333)
        at com.ibm.ws.asynchbeans.am._Alarm.run(_Alarm.java:230)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1815)



--
View this message in context: 
http://openjpa.208410.n2.nabble.com/how-to-lock-a-entity-with-pessmistic-lock-tp7583897.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to