使用JPA实施PessimistLock的良好做法

时间:2019-07-03 12:18:39

标签: jpa locking

这是我第一次在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()之间再次锁定记录,从而在过程中造成混乱。如果可以的话,我该如何预防?

0 个答案:

没有答案