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;
}
sorry, problem solved! now it acts like it should