【问题标题】:How to implement pessimistic locking in JPA with Glassfish 2.1?如何使用 Glassfish 2.1 在 JPA 中实现悲观锁定?
【发布时间】:2009-09-10 20:14:39
【问题描述】:

尝试设置锁时(悲观),使用以下代码:

em.lock(controlnumbers, LockModeType.WRITE);
em.refresh(controlnumbers);

我收到以下异常:

[#|2009-09-10T15:42:48.324-0400|INFO|sun-appserver2.1|javax.enterprise.system.container.ejb|_ThreadID=31;_ThreadName=httpSSLWorkerThread-8080-19;|
javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: javax.persistence.PersistenceException: ejb30-wrong-lock_called_without_version_locking-index (There is no English translation for this message.)
javax.persistence.PersistenceException: ejb30-wrong-lock_called_without_version_locking-index (There is no English translation for this message.)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.lock(EntityManagerImpl.java:619)
        at com.sun.enterprise.util.EntityManagerWrapper.lock(EntityManagerWrapper.java:582)
        at com.eximtechnologies.transactionserver.persistence.session.ControlNumbersFacade.lock(ControlNumbersFacade.java:43)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

如何使用 Glassfish 2.1 实现悲观锁定?

【问题讨论】:

    标签: java jpa locking glassfish java-ee-5


    【解决方案1】:

    有一个 Toplink Essentials(GF 2.1 默认)特定的方法来做到这一点:

    public MyObject lock (MyObject controlnumbers) {
        String qStr = "select object(o) from MyObject as o where o.pk = :pk";
        Query q = em.createQuery(qStr);
        q.setParameter("pk", "a");
        q.setHint("toplink.pessimistic-lock", "Lock");
        controlnumbers = (MyObject)q.getSingleResult();
        return controlnumbers;
    }
    

    我相信在 Hibernate 中调用 em.lock 确实有效。

    【讨论】:

      【解决方案2】:

      你能展示你班级的映射吗?看起来您缺少版本属性...看看

      http://en.wikibooks.org/wiki/Java_Persistence/Locking#Timestamp_Locking

      问候,扬

      【讨论】:

      • 如果我想要乐观锁定,那就行了。正如问题所述,我想要悲观锁定。 :)
      • 根据 EJB3 规范,lock() 仅支持具有 @version 属性的实体。
      • @Jan - 很好,但没有回答问题。 :) 大多数容器都能够支持悲观锁定(以某些容器特定的方式)。 Glassfish 也可以,通过查询提示... :)
      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2020-07-14
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多