2017-10-31 6 views
1

내 응용 프로그램의 세 가지 다른 인스턴스에서 다음 쿼리가 하나씩 큐에서 하나씩 테이블의 행을 읽으려고합니다.Oracle DB가 다음에 잠겨져 있지 않은 행을 읽습니다.

SELECT * FROM order_request_status ors WHERE ors.status = 'new' and ROWNUM <= 1 order by ors.id asc for update skip locked 

지금 문제는 행이 하나의 응용 프로그램 인스턴스에 의해 잠겨 있다면 두 번째 응용 프로그램 인스턴스가 쿼리에 의해 다음에 잠기지 않은 행을 읽도록하는 것입니다. 하지만 이것으로는 작동하지 않습니다 - 업데이트 건너 뛰기가 잠겼습니다.

oracle db를 사용하여 기능과 같은 큐를 구현할 수있는 방법을 제안하십시오.

답변

0

SKIP LOCKED 쿼리가 행을 반환 한 후에 처리됩니다. 당신의 술어는 ROWNUM<=1 때문에 하나의 레코드를 읽은 후에 멈추므로, 발견 한 레코드가 다른 세션에 의해 이미 잠겨 있다면 쿼리는 그것을 건너 뛰어 더 많은 레코드를 찾지 않습니다.

한 번에 하나의 레코드 만 처리하려면 ROWNUM을 사용하는 대신 커서에서 레코드 하나를 가져 오면됩니다.

+0

커서에서 레코드 하나를 가져 오는 방법은 무엇입니까? 내가 그것을 오름차순으로 ID를 주문하여 시스템에 입력 된 첫 번째 레코드를 가져올 수 있도록 그것을 제한하는 rownum을 사용하고 있습니다. – vashishth

+0

'retch into r' https://docs.oracle.com/database/121/LNPLS/static.htm#GUID-9DEED64C-A87E-4EAD-97DA-ABDD3FDF172C –