public static int getFreeUser(String entidad) throws Exception { IeciTdLongIntegerArrayList freeUserIds = null; int numFreeUsers, i; int freeUserId = -1, userId; boolean findFreeUser = false; DbConnection dbCon = new DbConnection(); try { dbCon.open(DBSessionManager.getSession(entidad)); freeUserIds = DaoUsrPoolTbl.selectFreeUserIds(dbCon); } catch (Exception e) { throw e; } finally { dbCon.close(); } numFreeUsers = freeUserIds.count(); for (i = 0; i < numFreeUsers; i++) { userId = freeUserIds.get(i); DbConnection dbConn = new DbConnection(); try { dbConn.open(DBSessionManager.getSession(entidad)); dbConn.beginTransaction(); DaoUsrPoolTbl.lockUserRow(dbConn, userId); // Se comprueba que nadie le ha cambiado el estado antes de bloquear // la fila if (DaoUsrPoolTbl.isUserFree(dbConn, userId)) { DaoUsrPoolTbl.setInUseStatus(dbConn, userId); findFreeUser = true; freeUserId = userId; } dbConn.endTransaction(true); if (findFreeUser) break; } catch (Exception e) { throw e; } finally { dbConn.close(); } } if (!findFreeUser) { throw new IeciTdException( UtilError.EC_NOT_EXISTS_POOL_FREE_USER, UtilError.EM_NOT_EXISTS_POOL_FREE_USER); } return freeUserId; }