2017-12-26 12 views
0

PG-약속 테이블을 잠급니다는 어떻게해야

db.result('DELETE FROM categories WHERE id = ${id}', category).then(function (data) { ... 

및 초기 다음 API 호출을 다음에 하나를 선택 API 호출에서 호출하고 삭제할

db.many('SELECT * FROM categories').then(function (data) { ... 

하지만 DB 요청에 대한 콜백이 발생 역순으로 카테고리가 삭제 된 카테고리 목록을 얻을 수 있습니다.

pg-promise로 카테고리 테이블을 잠그는 방법이 있습니까?

+0

삭제는 하나의 API 호출에서 호출 된 후 다음 API 호출에서 선택하면 삭제 된 카테고리가있는 범주 목록이 표시됩니다. 그렇다면 그 문제는 무엇입니까? –

+0

삭제 된 카테고리없이 새 목록을 뚜렷하게 원합니다. – user2846569

+0

그러나 select를 호출하기 전에 이미 delete를 호출하고 있습니다. 삭제 된 레코드 목록을 제공해서는 안됩니까? –

답변

1

당신은 항상 이전 DELETE의 결과를 반영하기 위해 SELECT의 결과를 원하는 경우에 당신은 결국, 그래서 당신은 고려해야 할 두 가지 방법 ...

표준 접근 방식은 하나에 작업을 통합하는 것입니다이 최대 동일한 연결에 대한 모든 의존 쿼리를 실행 :

db.task(function * (t) { 
    yield t.none('DELETE FROM categories WHERE id = ${id}', category); 
    return yield t.any('SELECT FROM categories'); 
}) 
    .then(data => { 
     // data = only the categories that weren't deleted 
    }); 

당신은 물론, 표준 약속 구문 또는 ES7 await/async를 사용할 수 있습니다.

두 번째 접근법은 서비스 내에서 인공 호흡을 구성하여 요청이 모두 완료 될 때까지 해당하는 SELECT을 실행하는 것을 보류합니다.

그러나 이것은 일반적으로 아키텍처의 결함을 지적하는 매우 어색한 해결책입니다. 또한 pg-promise의 저자로서, 필자는 어쨌든 내 라이브러리 외부의 방식이기 때문에 그 해결책을 배우지 않을 것입니다.

+0

답해 주셔서 감사합니다. 아마 아트 아키텍처를 다시 생각해야하고 리디렉션 만하면 삭제 된 응답을 받게됩니다. – user2846569

+0

@ user2846569 질문에 답을 한 경우 답변을 수락하십시오.) –