Hier ist eine Option für Sie, wenn Sie runnint Postgres < = 9,4, wo NOWAIT
existiert, aber SKIP LOCKED
sind. Dies zeigt die Verwendung von CONTINUE
und EXIT
in einem LOOP
, um die nächste verfügbare unverriegelte einzelne Zeile zu identifizieren.
DO $$
DECLARE
r RECORD;
... -- your variables
BEGIN
FOR r IN
SELECT some_id
FROM some_table
WHERE ... -- your conditions
ORDER BY ... -- your ordering
LIMIT ... -- your limit
LOOP
BEGIN
SELECT ... -- your needed column(s)
INTO ... -- your defined variable(s)
FROM some_table -- the same table
WHERE some_id = r.some_id -- only check this one record
FOR UPDATE NOWAIT; -- don't wait for parallel transactions
EXIT;
EXCEPTION WHEN lock_not_available THEN
CONTINUE;
END;
END LOOP;
... -- do something based on variables, or move this before the EXIT above
END;
$$ LANGUAGE plpgsql;