Dain, Sounds like you are wanting a pessimistic lock. The semantics of WRITE_LOCK are defined in optimistic terms in the spec.
The JPA 2.0 expert group is looking into this. In the mean time, only non-portable apps can get this behaviour. > -----Original Message----- > From: Dain Sundstrom [mailto:[EMAIL PROTECTED] > Sent: Friday, 22 February 2008 9:50 a.m. > To: [email protected] > Subject: EntityManager.lock not working > > I have a test case with two threads executing the following code: > > public void run() { > try { > beginTx(); > > Employee david = > entityManager.getReference(Employee.class, pk); > entityManager.lock(david, LockModeType.WRITE); > entityManager.flush(); > > Assert.assertTrue(entityManager.contains(david)); > > Assert.assertEquals(david.getId(), pk); > Assert.assertEquals(david.getFirstName(), "David"); > Assert.assertEquals(david.getLastName(), "Blevins"); > Assert.assertEquals(1000000.0, david.getSalary()); > > log("READ"); > > // wait for other threads to read > try { > startBarrier.await(2, TimeUnit.SECONDS); > } catch (Exception e) { > } > > > log("WRITE"); > david.setSalary(2000000); > > } catch (Throwable throwable) { > this.throwable = throwable; > } finally { > try { > commitTx(); > } catch (Throwable throwable) { > if (this.throwable == null) this.throwable = > throwable; > } > } > } > > The first thread successfully reads the row and waits. The > second throws an exception at the entityManager.flush() > command after the write lock. I would assume that when I say > "give me a write lock" > OpenJPA would "give me a write lock". Is there anyway to get > write lock in my application for single rows without having > to switch everything to SERIALIZABLE? > > -dain >
