MySQL を使用して「貧乏人のキューイング システム」を構築しています。これは、実行する必要があるジョブを含む単一のテーブルです (テーブル名は ですqueue)。複数のマシンにいくつかのプロセスがあり、その仕事はfetch_next2sprocを呼び出してキューからアイテムを取得することです。
この手順の要点は、2 つのクライアントに同じ仕事をさせないようにすることです。を使用すると、1 つの行をロックできるので、1 人の呼び出し元によってのみ更新されたことを確認できます ( 「準備完了」のジョブをフィルター処理するために使用されるSELECT .. LIMIT 1 FOR UPDATE基準に適合しなくなるように更新されます)。SELECT処理されます)。
誰が私が間違っているのか教えてもらえますか? 同じジョブが 2 つの異なるプロセスに与えられた例がいくつかあったので、正しく動作しないことがわかっています。:)
CREATE DEFINER=`masteruser`@`%` PROCEDURE `fetch_next2`()
BEGIN
SET @id = (SELECT q.Id FROM queue q WHERE q.State = 'READY' LIMIT 1 FOR UPDATE);
UPDATE queue
SET State = 'PROCESSING', Attempts = Attempts + 1
WHERE Id = @id;
SELECT Id, Payload
FROM queue
WHERE Id = @id;
END