0

ジョブ キューに対して何らかの更新を選択しようとしています。同じテーブルまたはデータベースに影響を与える同時プロセスをサポートするために必要です。このサーバーはキューにのみ使用されるため、キューごとのデータベースが許容されます。当初は以下のようなことを考えていました。

UPDATE state=1,ts=NOW() FROM queue WHERE ID IN (SELECT ID FROM queue WHERE state=0 LIMIT X) RETURN *

これにより競合状態が発生することを読んでいましたが、SELECTサブクエリでFOR UPDATEを使用するオプションがあったことを読みましたが、それにより行がロックされ、スキップしても構わない場所で同時呼び出しがブロックされます次のロックされていない行に移動します。

したがって、私が求めているのは、データベース全体のロックを最小限に抑える必要がある postgres で fifo システムを使用するための最良の方法です。

4

1 に答える 1

0

これを行う一般的な方法は、PLPGSQL 関数でラップし、FOR UPDATE NOWAIT を選択してから、例外処理を使用してロックされた行をスキップすることです。

これは、例外がなくても、例外処理を管理するために追加のプロセッサ サイクルが必要になるため、関数に追加のオーバーヘッドが発生します。

非常に簡単な例として:

 CREATE OR REPLACE FUNCTION get_all_unlocked_customers() RETURNS SETOF customer
 LANGUAGE PLPGSQL AS
 $$
 RETURN QUERY SELECT * FROM customer FOR UPDATE NOWAIT;
 EXCEPTION
    WHEN LOCK_NOT_AVAILABLE THEN
    -- NO NEED TO DO ANYTHING
    END;
 END;
 $$;
于 2013-12-01T03:38:45.413 に答える