Musíte použít PESSIMISTIC_WRITE
v době dotazu:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Uzamčení nadřazených objektů je dostatečné. K uváznutí nemusí nutně dojít. Pokud vlákno držící zámek neuvolní zámek dříve, než vyprší časový limit čekání, může dojít k selhání akvizice zámku.
Protože používáte Oracle, takto VYBRAT PRO AKTUALIZACI funguje:
Takže pokud T1 získal exkluzivní zámek na některých řádcích, T2 nebude moci číst tyto záznamy, dokud T1 neprovede potvrzení nebo vrácení zpět. Pokud T2 použil READ_UNCOMMITTED úroveň izolace, pak T2 nikdy nebude blokovat záznamy o zámku, protože jednoduše používá protokoly zpět k rekonstrukci dat, jako by to bylo v době, kdy dotaz začal. Na rozdíl od standardu SQL bude Oracle READ_UNCOMMITTED: