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

jav*_*r71 2 hibernate jpa optimistic-locking

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

我用@Version注释了我的实体 - 就像

@Version
private Long version;
Run Code Online (Sandbox Code Playgroud)

现在,我很困惑,如果这对于版本管理来说已经足够了,或者我需要显式调用EntityManager.lock()api之类的

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

提前致谢,

esa*_*saj 6

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

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

如果更新失败(某人/某事已经改变了数据和版本),你会得到OptimisticLockException(因为你使用的是EntityManager,我认为这是关于JPA的,在"原始"Hibernate中它可能就像StaleStateException).