[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [eclipselink-users] JPA locking
|
There are definitely cases when pessimistic locking makes sense, such as
high-contention applications. Normally it is used in server-side locking,
as you rarely desire to hold a pessimistic lock while waiting for a response
from a web client. In some cases you can also use optimistic locking with a
retry block.
EclipseLink supports pessimistic locking through the query hint,
"eclipselink.pessimistic-lock"="Lock".
cowwoc wrote:
>
> James,
>
> How do you deal with high-contention applications where optimistic locking
> is going to run into collisions with high frequency?
>
> As for recovering from OptimisticLockException, I'll give you a better
> use-case. Say you have an online shopping cart application where each
> product has X inventory items and users should be able to place an order
> so long as there is at least one item left. The problem is that between
> the time the user adds the item to the cart to the moment he completes the
> order form at least one item might have already gotten sold. Now, you want
> to use optimistic locking over the Product but you don't care if the
> inventory count decreased so long as there is at least one left. How do
> you implement this? And more generally, how do you implement "decrement"
> in a high-contention scenario without lost updates? That is, if 10 people
> order the same item at the same time, I don't want to ask 9 people to
> repeat the order process because of a OptimisticLockException.
>
> Thanks,
> Gili
>
>
> James Sutherland wrote:
>>
>> I'm not sure where the lock exception would occur in your use case. But
>> in general, whether something is valid or not depends on the application
>> and use case, for some applications no locking at all is perfectly valid.
>>
>> In JPA there is no pessimistic locking at all, so there is no correct way
>> to use pessimistic locking. The lock() API acquires an optimistic lock,
>> not a pessimistic lock. It means that the version will be checked, or
>> updated on commit, it does not matter when it is called in the
>> transaction, as the check occurs on commit. The link gives a hack to
>> attempt to simulate pessimistic locking using an update, it may work in
>> some cases. In EclipseLink you can just use the query hint to acquire a
>> pessimistic lock.
>>
>>
>>
>> cowwoc wrote:
>>>
>>> Hi James,
>>>
>>> I've been reading http://en.wikibooks.org/wiki/Java_Persistence/Locking
>>> and it's a godsend... I've been looking for this kind of
>>> straight-forward discussion for a long time now. So first of all, thank
>>> you for the article, I really appreciate it! :)
>>>
>>> Now, as for
>>> http://en.wikibooks.org/wiki/Java_Persistence/Locking#Handling_optimistic_lock_exceptions
>>> I was wondering, is it reasonable to automate handling of the
>>> OptimisticLockException in the following case?
>>>
>>> - Server holds a collection of images
>>> - Client requests a random image
>>> - Server queries the total number of images
>>> - Server selects a random number
>>> - Server queries image at index X but it turns out that the image was
>>> deleted since the previous query
>>>
>>> In such a case, the client really did nothing wrong. From it's point of
>>> view the request is still valid (no stale data, nothing that would cause
>>> it to change the request in any way). As such, would it be reasonable
>>> for the server to automatically replay the request and select another
>>> image randomly?
>>>
>>> Secondly,
>>> http://www.funofmath.com/weblog/2008/03/implementation-of-pessimistic-locking.html
>>> indicates that the only way to lock pessimisticly (without race
>>> conditions) is by doing:
>>>
>>> Object entity = entityManager.getReference(clazz, id);
>>> entityManager.lock(entity, LockMode);
>>>
>>> I was wondering whether this is portable across all JPA vendors and
>>> whether you could please add this to the Wiki page? Also, you probably
>>> want to revise
>>> http://en.wikibooks.org/wiki/Java_Persistence/Locking#Example_of_Using_the_Lock_API
>>> as it seems to be open to a race condition (you should be locking the
>>> Manager before reading his salary, not the other way around.)
>>>
>>> Thank you,
>>> Gili
>>>
>>
>>
>
>
-----
---
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland
http://www.eclipse.org/eclipselink/
EclipseLink , http://www.oracle.com/technology/products/ias/toplink/
TopLink
Wiki: http://wiki.eclipse.org/EclipseLink EclipseLink ,
http://wiki.oracle.com/page/TopLink TopLink
Forums: http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink ,
http://www.nabble.com/EclipseLink-f26430.html EclipseLink
Book: http://en.wikibooks.org/wiki/Java_Persistence Java Persistence
--
View this message in context: http://www.nabble.com/JPA-locking-tp19525631p19552752.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.