私は同じデータストア(ある種のキュー)にアクセスし、データで何かをする必要がある複数の子プロセスを同時に起動するRubyスクリプトを作成しようとしています。問題は、データの各行が一度だけ処理される必要があり、子プロセスは、同じ瞬間に別の子プロセスが同じデータで動作しているかどうかを知る方法がないことです。1つのデータストア。複数のプロセス。このSQLは競合状態を防ぎますか?
私はまだ、データストアを選んしていないが、それは私が使用してるものだというだけの理由私は、PostgreSQLに向かって傾いています。
UPDATE jobs
SET status = 'processed'
WHERE id = (
SELECT id FROM jobs WHERE status = 'pending' LIMIT 1
) RETURNING id, data_to_process;
しかし、これは実際に動作します:SELECTが行われる前にUPDATE句は、おそらくテーブルの行をロックしますので、私は、競合状態を避けるための方法として提案され、次のSQLの断片を見てきましたか? Postgres(または他のデータベース)がSELECTを実行する前にテーブル行をロックするのは直感的ではないようです。SELECTを実行して、更新のためにロックする必要があるテーブル行を判断する必要があるからです。言い換えれば、私は、このSQLの断片が、2つの別々のプロセスが同じテーブル行で選択されて動作することを本当に妨げないことに懸念しています。
私は妄想していますか?このような並行処理の状況を処理するために、従来のRDBMSより優れたオプションがありますか?
実際には1つの問題は、あなたがロックの問題を持っているし、あなたの取引が長い場合、彼らは他のキューの要求を保持することです。これがほんの少しであればそれは問題ではありません。何百ものリスナーと仕事が1秒間に処理されている場合、大きな問題になる可能性があります。これは、Skypeがpg_message_queueを書いたときよりも複雑な解決策をとったと考えている理由の1つです。 –