2014-09-10 2 views
0

node.js + express 4 + socket.io + postgresql (knex.js) 애플리케이션이 있습니다. 그 목적은 처리를 위해 socket.io를 통해 연결된 클라이언트에게 작업을 보내는 것입니다. 이것은 내가 계산을 위해 새 작업을 가져 오는에 대한 쿼리를 구현하는 방법입니다 node.js, postgresql 및 knex.js를 사용할 때 인종

update data 
    set status='computing' 
    where id = (select id from data where status = 'new' limit 1) 
    returning * 

내가 보장하기 returning 옵션 update을 사용, 작업을 가져 오는 그 작업이 원자입니다. 문제는 여러 클라이언트가있는 경우 어쨌든 여러 번 요청할 수 있다는 것입니다.

이것은 쿼리 작성에 knex.js 라이브러리를 사용할 때만 발생합니다. 나는 그 이유가 의심 스럽다. knex.js는 연결 풀을 열어 둔다. 디버깅 할 때, 내 앱이 결과를 확인한 약속이 있기 전에 여러 번 쿼리를 실행하는 메소드를 친 것 같습니다. (그리고 나서 많은 경우에 동일합니다.) 연결되어있는 ~ 20 명의 클라이언트가있는 경우, 8 명까지도 내 응용 프로그램에서 동일한 작업을 수행 할 수 있습니다.

처음에는 DB 연결이 생성 될 때마다 pg-query 모듈을 사용했는데 모든 것이 제대로 작동했습니다.

편집 : 이제 두 번째 방법에도 경주가 있다는 것을 알게되었습니다. 단지 그들은 단지 빈도가 훨씬 적습니다.

그래서 내가 뭘 잘못하고 있니? 코드/db를 개선하여 어떻게 향상시킬 수 있습니까?

답변

관련 문제