OpenJPA
  1. OpenJPA
  2. OPENJPA-1602

Query with lock mode set to PESSIMISTIC_WRITE does not have for update clause attached to the sql when runs twice

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 2.0.0
    • Fix Version/s: 2.0.0
    • Component/s: jdbc
    • Labels:
      None

      Description

      The following test case executes query two times.

      The sql generated for the first time:
      sql = SELECT t0.KEYNAME, t0.KEYVAL FROM KEYGEN t0 WHERE (t0.KEYNAME = ?) optimize for 1 row FOR READ ONLY WITH RR USE AND KEEP UPDATE LOCKS

      The sql generated for the second time:
      sql = SELECT t0.KEYNAME, t0.KEYVAL FROM KEYGEN t0 WHERE (t0.KEYNAME = ?)

      public void testKeyGen() {
      EntityManager em = emf.createEntityManager();
      KeyGenEntity key = null;
      em.getTransaction().begin();
      for (int i = 0;i < 2; i++) {
      Query q = em.createNamedQuery("getStationKeyForUpdate");
      q.setLockMode(LockModeType.PESSIMISTIC_WRITE);
      q.setParameter("keyname", keyName);
      try

      { key = (KeyGenEntity) q.getSingleResult(); em.refresh(key); }

      catch (NoResultException e)

      { // No keys found for this name - create a new one int keyVal = 0; key = new KeyGenEntity(keyName, keyVal); em.persist(key); em.lock(key, LockModeType.PESSIMISTIC_WRITE); }

      int keyVal = key.getKeyval();
      key.setKeyval(keyVal + 1);
      }
      em.getTransaction().commit();
      }

        Activity

        Hide
        Fay Wang added a comment -

        The following is the KeyGenEntity.java:

        import javax.persistence.Column;
        import javax.persistence.Entity;
        import javax.persistence.Id;
        import javax.persistence.NamedQuery;
        import javax.persistence.Table;

        /**

        • Handles key gen generation for a number of cases.
          *
          */
          @Entity
          @Table(name="KEYGEN")
          @NamedQuery(name="getStationKeyForUpdate",
          query="select kg from KeyGenEntity as kg where kg.keyname = :keyname")
          public class KeyGenEntity {

        @Id
        @Column(name="KEYNAME")
        private String keyname;
        @Column(name="KEYVAL")
        private int keyval;

        public String getKeyname()

        { return keyname; }

        public void setKeyname(String keyname)

        { this.keyname = keyname; }

        public int getKeyval()

        { return keyval; }

        public void setKeyval(int keyval)

        { this.keyval = keyval; }

        public KeyGenEntity() {
        }

        public KeyGenEntity(String keyname, int keyval)

        { super(); this.keyname = keyname; this.keyval = keyval; }

        }

        Show
        Fay Wang added a comment - The following is the KeyGenEntity.java: import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.persistence.Table; /** Handles key gen generation for a number of cases. * */ @Entity @Table(name="KEYGEN") @NamedQuery(name="getStationKeyForUpdate", query="select kg from KeyGenEntity as kg where kg.keyname = :keyname") public class KeyGenEntity { @Id @Column(name="KEYNAME") private String keyname; @Column(name="KEYVAL") private int keyval; public String getKeyname() { return keyname; } public void setKeyname(String keyname) { this.keyname = keyname; } public int getKeyval() { return keyval; } public void setKeyval(int keyval) { this.keyval = keyval; } public KeyGenEntity() { } public KeyGenEntity(String keyname, int keyval) { super(); this.keyname = keyname; this.keyval = keyval; } }
        Hide
        Donald Woods added a comment -

        showing as affects/fix for 2.0.0

        Show
        Donald Woods added a comment - showing as affects/fix for 2.0.0

          People

          • Assignee:
            Pinaki Poddar
            Reporter:
            Fay Wang
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development