1

私は node.js、node-postgres、および Postgres を使用して、テーブルから大量のデータを処理するスクリプトをまとめています。私もクラスターモジュールを使用しているので、単一のスレッドにこだわることはありません。

クラスター内の子プロセスの 1 つが別のプロセスを複製することは望ましくありません。別のプロセスまたはクエリが同じ行を選択する可能性なしに、選択クエリから受け取ったばかりの行を更新するにはどうすればよいですか?

SQL クエリは次のようになると想定しています。

BEGIN;
SELECT * FROM mytable WHERE ... LIMIT 100;
UPDATE mytable SET status = 'processing' WHERE ...;
COMMIT;

Postgres と SQL の知識が乏しいことをお詫びします。単純な PHP Web アプリで一度使用したことがありますが、node.js で使用したことはありません。

4

2 に答える 2

1

マルチスレッドアプリケーションを使用している場合、「for Update」(とにかくメインスレッドで) を使用することはできませんし、使用すべきではありません。使用する必要があるのはアドバイザリロックです。各スレッドは 1 行または mnany 行を照会し、それらがロックされていないことを確認してからロックして、他のセッションがそれらを使用しないようにすることができます。各スレッド内では次のように簡単です。

select * from mytab
where pg_try_advisory_lock(mytab.id)
limit 100

最後に、pg_advisory_unlock を使用してロックを解除してください。

于 2015-01-02T13:36:52.823 に答える