Я получаю список объектов в, в спящем режиме с помощью Критериев API. Однако я должен соединить те объекты, поскольку другой поток, выполняющийся одновременно, получит точные объекты, и только один из потока преуспеет в отсутствии пессимистической блокировки.
Я попробовал как ниже, но это не работает.
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();
Обновление: Я выполняю обновление после этого оператора, так, чтобы я хотел бы, чтобы оба потока считали различные строки, или по крайней мере второй поток должен ожидать, пока первый поток не завершается с транзакцией и оставляет блокировку.
И быть в спящем режиме сгенерированного запроса ниже.
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 ?
Обновление: Это кажется ошибкой в 3.5.2 версиях как Pascal Thivent (Большое спасибо Pascal) упомянутый, я присоединился как участник и наблюдение проблемы. Надо надеяться, это будет включено в следующий выпуск.
Однако я пытался использовать другой подход здесь с session.buildLockRequest()
... но я не мог вполне выяснить, как использовать его, и использующий ниже кода не имеет никакого эффекта вообще.
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
Какую версию Hibernate вы используете? Может ли это быть HHH-5275 ? Вы уверены, что оператор FOR UPDATE
не создается? Можете ли вы показать сгенерированный SQL?