You must use the built-in database locking mechanisms. Do not reinvent the wheel, especially since RDBMS are designed to work with concurrency and consistency.
Oracle 11g SKIP LOCKED. , (, id - ):
CREATE OR REPLACE TYPE tab_number IS TABLE OF NUMBER;
CREATE OR REPLACE FUNCTION reserve_jobs RETURN tab_number IS
CURSOR c IS
SELECT id FROM IMPORTJOBS WHERE STATUS = 'REGISTERED'
FOR UPDATE SKIP LOCKED;
l_result tab_number := tab_number();
l_id number;
BEGIN
OPEN c;
FOR i IN 1..10 LOOP
FETCH c INTO l_id;
EXIT WHEN c%NOTFOUND;
l_result.extend;
l_result(l_result.size) := l_id;
END LOOP;
CLOSE c;
RETURN l_result;
END;
10 ( ), . , .
10g , Oracle , FOR UPDATE , , . , SELECT:
SELECT *
FROM IMPORTJOBS
WHERE STATUS = 'REGISTERED'
AND rownum <= 10
FOR UPDATE;
, SELECT? :
- A 10 , .
- B 10 , A.
- .
- Oracle () B , ,
FOR UPDATE ( Oracle ).
, B 10 .
, . , , , concurrency .