[ 
https://issues.apache.org/jira/browse/OPENJPA-2547?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14229890#comment-14229890
 ] 

Rick Curtis commented on OPENJPA-2547:
--------------------------------------

Heath --

You should use the LockLevels constant rather than a zero.

ie: 
List<SQLBuffer> sqls = (sm.getLock() == null || 
sm.getLock().equals(org.apache.openjpa.kernel.LockLevels.LOCK_NONE ))

Thanks,
Rick

> When two threads attempt to get a Pessimistic Lock, one thread gets a 'false' 
> lock.
> -----------------------------------------------------------------------------------
>
>                 Key: OPENJPA-2547
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2547
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jdbc
>    Affects Versions: 2.1.2, 2.2.2, 2.2.1.1, 2.3.0, 2.4.0
>            Reporter: Heath Thomann
>            Priority: Critical
>         Attachments: OPENJPA-2547-2.1.x.patch
>
>
> I have created a scenario where two threads both attempt to get a pessimistic 
> lock on an object, where one thread legitimately gets the lock, and the other 
> gets a 'false' lock.  To describe this issue, lets look at a test.  I will 
> provide (attache) a full working test, but for now lets look at this snippet 
> of the test which is at the heart of the issue:
> PessimisticLockEntity entity = oem.find(PessimisticLockEntity.class, pKey);
>             boolean locked = false;
>             while (!locked) {
>                 try {
>                     oem.getFetchPlan().setLockTimeout(5000);
>                     oem.lock(entity, LockModeType.PESSIMISTIC_READ);
>                     locked = true;
>                 } catch (PessimisticLockException ple) {
> With this test, imagine the case where two threads call this code at roughly 
> the same time.  In this case, one thread should receive a lock, and the other 
> thread should receive a PessimisticLockException (PLE).  In my test, this is 
> what happens.....so far so good.  However, the thread with the lock (call it 
> T1) then sleeps for a while, and the thread which got the PLE (call it T2) 
> attempts to get the lock over and over again.  When T2 tries to get a lock 
> while T1 holds the lock, T2 should continue to receive a PLE.  However, I've 
> found that T2 "gets" a lock.  That is, a PLE is never thrown because OpenJPA 
> doesn't execute SQL to obtain the lock.  OpenJPA skips that steps and thinks 
> T2 has a lock.  This gives T2 a false lock.
> I've found that prior to JIRA OPENJPA-2449, we got the expected results (i.e. 
> T2 continues to get a PLE while T1 holds the lock).  It is only with 
> OPENJPA-2449 that the incorrect behavior occurs.
> I will provide a patch which contains a potential fix, and a test that does 
> two things: 1) tests the scenario above and 2) provides a test to verify 
> OPENJPA-2449 (we never provided a test when we committed OPENJPA-2449).  My 
> fix, if correct, simply adds one additional check to the code added via 
> OPENJPA-2449.
> Thanks,
> Heath



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to