Pobieram listę obiektów w stanie hibernacji za pomocą interfejsu API Criteria. Jednak potrzebuję zablokować te obiekty, ponieważ inny wątek wykonywany w tym samym czasie dostanie dokładne obiekty i tylko jeden z wątków odniesie sukces pod nieobecność pesymistycznej blokady.Jak określić pesymistyczną blokadę za pomocą API Criteria?
Próbowałem jak poniżej, ale to nie działa.
List esns = session
.createCriteria(Reddy_Pool.class)
.add(Restrictions.eq("status", "AVAILABLE"))
.add(Restrictions.eq("name", "REDDY2"))
.addOrder(Order.asc("id"))
.setMaxResults(n)
.setLockMode(LockMode.PESSIMISTIC_WRITE) //not working at all
.list();
Aktualizacja: Ja wykonywania aktualizacji po tym oświadczeniu, tak, że chciałbym oba wątki czytać różne wiersze lub przynajmniej drugi wątek powinien czekać, aż pierwszy wątek kończy z transakcją i opuszcza zamek.
Zapytanie wygenerowane przez hibernację znajduje się poniżej.
Hibernate: select this_.id as id1_0_, this_.name as name1_0_,
this_.orderitem_id as orderitem3_1_0_, this_.status as status1_0_,
this_.store as store1_0_, this_.vendor as vendor1_0_, this_.version as version1_0_
from reddy_pool this_
where this_.status=? and and this_.name=? order by this_.id asc limit ?
Aktualizacja: Wydaje się to błąd w wersji 3.5.2 Pascal Thivent (dzięki dużo Pascal) wspomniano, mam dołączył jako członek i oglądając ten problem. Mam nadzieję, że zostanie uwzględniony w następnym wydaniu.
Jednak próbowałem użyć innego podejścia tutaj z session.buildLockRequest()
... ale nie mogłem się dowiedzieć, jak go używać i używanie poniższego kodu nie ma żadnego efektu.
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
Co masz na myśli mówiąc "nie działa"? AFAIK bez blokad oba odczyty powinny odnieść sukces. –
@ Péter, zaktualizowałem moje pytanie. Zasadniczo chcę wykonać aktualizację po tym wybierz. – Reddy