我是新手使用“乐观锁定”机制 - 我正在使用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);
}
提前致谢,
答案 0 :(得分:6)
通过@Version使用乐观锁定时,根本不需要显式锁定(悲观锁定)。当实体更新到数据库时,将发生以下查询:
UPDATE QueryDTO SET status=<updated status>, ...other values..., version=100 WHERE id=<id> AND version=99
如果更新失败(某人/其他人已更改数据和版本),您将获得OptimisticLockException
(因为您正在使用EntityManager,我认为这是关于JPA,在“原始”Hibernate中可能就像StaleStateException一样。)