Как указать пессимистическую блокировку с помощью Criteria API? - PullRequest
8 голосов
/ 12 июня 2010

Я получаю список объектов в спящем режиме, используя 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));

1 Ответ

3 голосов
/ 12 июня 2010

Какую версию Hibernate вы используете?Может ли это быть ЧЧХ-5275 ?Вы уверены, что оператор FOR UPDATE не сгенерирован?Можете ли вы показать сгенерированный SQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...