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