Hello!

I have this method executed concurrently in many threads (MDBs), which 
generates quite many OptimisticLockException.

I changed the datasource from HSQL to PostgreSQL and tried to add a
SELECT FOR UPDATE statement to act like a mutex

But why i keep getting OptimisticLockExceptions then?
did i do some mistake?


  |     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  |     public Process fetchProcess_real(int subsystem) {
  |             
  |             String lockQuery = "SELECT * FROM BPS_SUBSYSTEM WHERE id = :id 
FOR UPDATE";
  |             
  |             String fetchQuery = 
  |             "SELECT " +
  |             "       p " +
  |             "FROM " +
  |             "       Process AS p " +
  |             "WHERE " +
  |             "       p.state = 0 AND " +
  |             "       p.processQueue.id IN " +
  |             "               (SELECT " +
  |             "                       pq.id " +
  |             "                FROM " +
  |             "                       ProcessQueue AS pq " +
  |             "                WHERE " +
  |             "                       (pq.subsystem.id = " +
  |             "                               (SELECT " +
  |             "                                       s.id " +
  |             "                                FROM " +
  |             "                                       Subsystem AS s " + 
  |             "                                WHERE " +
  |             "                                       (s.id = " + subsystem + 
") AND " +
  |             "                                       (s.connected = true) " +
  |             "                               ) " +
  |             "                       ) AND " +
  |             "                       (pq.connected = true) AND " +
  |             "                       (pq.curActiveProcesses < 
pq.maxActiveProcesses) " +
  |             "               ) " +
  |             "ORDER BY p.priority ASC, p.id ASC";
  |             
  |             Query nquery = em.createNativeQuery(lockQuery,Subsystem.class);
  |             nquery.setParameter("id",subsystem);
  |             Subsystem subsys = (Subsystem) nquery.getSingleResult();
  |             
  |             
  |             Query query = em.createQuery(fetchQuery);
  |             query.setMaxResults(1);
  |             List<Process> ProcessList = query.getResultList();
  |             if ((ProcessList == null) || ProcessList.isEmpty()) return null;
  |             
  |             Process p = ProcessList.get(0);
  |             ProcessQueue pq = p.getProcessQueue();
  |             
  |             p.use();
  |             pq.incrementActive();
  |             
  |             em.merge(p);
  |             em.merge(pq);
  | 
  |             return p;
  |     }
  | 

(ps the method is called always with the same parameter)

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4103323#4103323

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4103323
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to