Я получаю список объектов в спящем режиме, используя Criteria 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 как PascalThivent (спасибо большое Pascal) упомянул, я присоединился как участник и смотрю проблему.Надеюсь, он будет включен в следующий выпуск.
Однако я попытался использовать другой подход здесь с session.buildLockRequest()
... но я не мог понять, как его использовать, и использование приведенного ниже кода не имеет никакогоэффект на всех.
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));