PostgreSQL で以下のようなクエリがあります。
UPDATE
queue
SET
queue.status = 'PROCESSING'
WHERE
queue.status = 'WAITING' AND
queue.id = (SELECT id FROM queue WHERE STATUS = 'WAITING' LIMIT 1 )
RETURNING
queue.id
多くのワーカーは一度に 1 つの作業を処理しようとします (そのため、制限 1 のサブクエリがあります)。今回の更新以降、ワーカーごとにidの情報を取得して処理を行っていますが、同じ作業を2回以上取得して処理する場合があります。分離レベルは Read Committed です。
私の質問は、1 つの作品が 1 回処理されることを保証するにはどうすればよいですか? 非常に多くの投稿があることは知っていますが、それらのほとんどを試してみましたが、役に立ちませんでした () ;
- SELECT FOR UPDATE を試しましたが、デッドロック状態になりました。
- pg_try_advisory_xact_lock を試しましたが、共有メモリが不足しました
AND pg_try_advisory_xact_lock(queue.id)
外側のクエリのWHERE句に追記してみたのですが… [?]
どんな助けでも大歓迎です。