2

我是使用“乐观锁定”机制的新手——我正在使用休眠(在 Jboss 中)和容器管理事务(CMT)。我想在我的实体读取实体更新之间其他人更新数据库中的同一实体(即行)时处理这种情况。在这种情况下,我想抛出异常..

我已经用 @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);
  }

提前致谢,

4

1 回答 1

7

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

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

如果更新失败(某人/其他人更改了数据和版本),您将得到OptimisticLockException(因为您使用的是 EntityManager,我假设这是关于 JPA,在“原始”Hibernate 中它可能类似于 StaleStateException)。

于 2011-03-15T06:00:46.880 回答