这是我第一次在JPA中实现LockModeType.PESSIMISTIC_WRITE,我不确定一致性。
例如,我的通用DAO中有以下两种方法:
public T getByIdWithLock(Integer id, Class<T> clazz) {
em = new JPAUtil().getEntityManager();
T t;
try {
em.getTransaction().begin();
em.setProperty("javax.persistence.lock.timeout", 0);
t = em.find(clazz, id, LockModeType.PESSIMISTIC_WRITE);
return t;
} catch (PessimisticLockException | LockTimeoutException e) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Atenção!", "O registro está sendo alterado por outro usuário.");
FacesContext.getCurrentInstance().addMessage(null, message);
LOGGER.log(Level.SEVERE, e.toString(), e);
em.getTransaction().rollback();
em.close();
return null;
}
}
public boolean updateWithLock(T t) {
try {
//lock commit before update
em.getTransaction().commit();
em.getTransaction().begin();
em.merge(t);
em.getTransaction().commit();
return true;
} catch (Exception e) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Não foi possivel alterar " + t.getClass().getSimpleName());
FacesContext.getCurrentInstance().addMessage(null, message);
LOGGER.log(Level.SEVERE, e.toString(), e);
em.getTransaction().rollback();
return false;
} finally {
em.close();
}
}
基本上,在一个示例情况下,我的用户从数据库中获取记录,进行编辑并进行更新。在后台,getByIdWithLock获取记录并对其进行锁定,然后在updateWithLock中使用以下命令释放锁定
em.getTransaction().commit();
并使用常规
进行更新 em.merge(t);
到目前为止,我还没有发现任何问题,但是我不确切知道其他用户是否可以在锁定commit()和merge()之间再次锁定记录,从而在过程中造成混乱。如果可以的话,我该如何预防?