关于乐观锁定的基本问题(Hibernate)

时间:2011-03-15 03:04:20

标签: hibernate jpa optimistic-locking

我是新手使用“乐观锁定”机制 - 我正在使用hibernate(在Jboss中)和容器管理事务(CMT)。 我想在我的 entity-read entity-update 之间处理这样的场景,其他人在DB中更新同一个实体(即行)。 在这种情况下,我想抛出异常..

我用@Version注释了我的实体 - 比如

@Version
private Long version;

现在,我很困惑,如果这对于版本管理来说已经足够了,或者我需要明确调用 EntityManager.lock()api就像

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

提前致谢,

1 个答案:

答案 0 :(得分:6)

通过@Version使用乐观锁定时,根本不需要显式锁定(悲观锁定)。当实体更新到数据库时,将发生以下查询:

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

如果更新失败(某人/其他人已更改数据和版本),您将获得OptimisticLockException(因为您正在使用EntityManager,我认为这是关于JPA,在“原始”Hibernate中可能就像StaleStateException一样。)