Основной вопрос о оптимистической блокировке (Hibernate) - PullRequest
2 голосов
/ 15 марта 2011

Я новичок в использовании механизма «оптимистической блокировки» - я использую hibernate (в Jboss) и Container Managed Transaction (CMT).Я хочу обработать сценарий, когда между моим считыванием сущностей и обновлением сущности кто-то другой обновляет ту же сущность (то есть строку) в БД.В таком случае я хочу выдать исключение ..

Я аннотировал свою сущность с помощью @Version - как

@Version
private Long version;

Теперь я запутался, если этого достаточно для управления версиями или мне нужноявно вызывать API EntityManager.lock () как

  {
    .
    .
    final QueryDTO queryDTO = entityManager.find(QueryDTO.class, id);
    entityManager.lock(queryDTO, LockModeType.READ);
    queryDTO.setStatus(updatedStatus);
    entityManager.persist(queryDTO);
  }

Заранее спасибо,

1 Ответ

6 голосов
/ 15 марта 2011

Вам не нужны явные блокировки (пессимистическая блокировка) вообще при использовании оптимистической блокировки через @Version. Когда сущность обновляется в базе данных, выполняется что-то вроде следующего запроса:

UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99

Если обновление завершится неудачно (кто-то / что-то еще изменило данные и версию), вы получите OptimisticLockException (Поскольку вы используете EntityManager, я предполагаю, что речь идет о JPA, в «сыром» Hibernate это могло было что-то вроде StaleStateException).

...