You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Miłosz Tylenda <mt...@o2.pl> on 2008/11/12 18:46:38 UTC
Re: How does an explicit EntityManager.lock() call prevent dirtyreadsin JPA
Vlad,
I agree with your thinking on your scenario. That's why I think you need row locking in the database and it matters when you call lock() in order to prevent T2's dirty read.
Greetings,
Milosz
> Hello Milozs,
>
> thanks for your reply. Maybe you are right, anyway, pls comment on my
> scenario. There is nothing preventing T2 from commiting with a dirty read;
> the lock() call doesen't even get the chance to be called.
>
> Waiting for your opinion.
>
>
> Miłosz Tylenda wrote:
> >
> > Vlad,
> >
> > Maybe the cited sentence is not correct? It says:
> >
> >> 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
> >
> > But if you read the JPA spec it says exactly what you have read in the
> > JavaDoc but also adds:
> >
> > "This will generally be achieved by the entity manager acquiring a lock on
> > the underlying database row.
> > Any such lock may be obtained immediately (so long as it is retained until
> > commit completes), or the
> > lock may be deferred until commit time (although even then it must be
> > retained until the commit com-
> > pletes). Any implementation that supports repeatable reads in a way that
> > prevents the above phenomena
> > is permissible."
> >
> > I understand from this that an implementation can do a SELECT FOR UPDATE
> > for a lock() instead of being restricted to optimistic concurrency
> > control.
> >
> > Greetings,
> > Milosz
> >
> >
> >
> >> Hi,
> >>
> >> i'm trying to understand the behaviour of the EntityManager.lock() call.
> >> The Sun documentation (
> >> http://java.sun.com/javaee/5/docs/api/javax/persistence/LockModeType.html)
> >> on this is a bit confusing for me and i will explain why. It says that if
> >> T1
> >> calls EntityManager.lock() on an entity, then T2 couldn't make a dirty
> >> read.
> >> Also i read here (http://www.nabble.com/JPA-locking-td19525631.html) that
> >> "
> >> 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
> >> "
> >> So it does not matter when the lock call is made. Ok, now let's imagine
> >> the
> >> following typical scenario of the dirty read in a time-point follow-up:
> >> T1 T2
> >> ---------------------------------------------------
> >> T1: W(edit some entity E)
> >> T2: R(reads E)
> >> T2: commit
> >> T1: lock(E)
> >> T1: commit
> >> ---------------------------------------------------
> >> So there is nothing from preventing T2 to commit in this concurrent
> >> transaction scenario and thus making a dirty read.
> >> So my guess is:
> >> - either the javadoc would be wrong presenting that T1 is the one doing
> >> the
> >> lock() call instead of T2 doing it.
> >> - or the lock() call moment is infact important and, in this case, doing
> >> it
> >> before the W(edit) in T1 should solve the problem.
> >> Would be nice to give the insights on how this works. Thanks.
> >>
> >> Vlad
> >> --
> >> View this message in context:
> >> http://n2.nabble.com/How-does-an-explicit-EntityManager.lock%28%29-call-prevent-dirty-reads-in-JPA-tp1480410p1480410.html
> >> Sent from the OpenJPA Developers mailing list archive at Nabble.com.
> >>
> >>
> >
> >
>
> --
> View this message in context: http://n2.nabble.com/How-does-an-explicit-EntityManager.lock%28%29-call-prevent-dirty-reads-in-JPA-tp1480410p1486495.html
> Sent from the OpenJPA Developers mailing list archive at Nabble.com.
>
>