MySQL テーブルに対して同時に読み書きできるワーカーが複数あるとします (例: jobs)。各ワーカーのタスクは次のとおりです:
jobs
キューに入れられた
RUNNING
ワーカーがステップ #1 を実行するとき、適格なジョブが 存在しない可能性があることに注意してください (つまり、QUEUED)。
)。
ROLLBACK) トランザクションをキャンセルする必要があると思います。以下のコードでこれを行うにはどうすればよいでしょうか? ああああ
) トランザクションをキャンセルする必要があると思います。以下のコードでこれを行うにはどうすればよいでしょうか?
あなたが何を望んでいるのかは明確ではありません。しかし、あなたのタスクが次の QUEUED ジョブを見つけることであるとします。ステータスを RUNNING に設定し、適切な ID を選択します。
QUEUED
シングルスレッド環境では、コードをそのまま使用できます。選択した ID をアプリケーション コードの変数に抽出し、WHERE 句の UPDATE クエリに渡します。 write ステートメントは 1 つだけなので、トランザクションも必要ありません。これを SQLscript で真似ることができます。
これがあなたの現在のステータスであると仮定します:
次のキューに入れられたジョブ (id=2) を開始したいと考えています。
あなたは得ます
最後の選択から開始します。テーブルのステータスは次のようになります:
DB Fiddle で見る
ジョブを起動するプロセスが複数ある場合は、FOR UPDATE を使用して行をロックする必要があります。ただし、LAST_INSERT_ID() を使用すると、この状況を回避できます。
FOR UPDATE
LAST_INSERT_ID()
リーリー
ROW_COUNT() は 0 になります。
は
になります。
jobs テーブルに保存したいと考えています。簡単な例: リーリー ###そして### リーリー
テーブルに保存したいと考えています。簡単な例:
を使用するだけで選択できます。 リーリー
queued_at
started_at、finished_at。
、
。
今週、私はあなたのケースと非常によく似たものを実装します。複数のワーカー。それぞれが一連の行の「次の行」を取得して作業します。
疑似コードは次のとおりです:
FOR UPDATE を使用することは、競合状態 (つまり、複数のワーカーが同じ行を取得しようとすること) を回避するために重要です。
SELECT ... INTO の詳細については、https://dev.mysql.com/doc/refman/8.0/en/select-into.html を参照してください。
を参照してください。
あなたが何を望んでいるのかは明確ではありません。しかし、あなたのタスクが次の
QUEUED
ジョブを見つけることであるとします。ステータスをRUNNING
に設定し、適切な ID を選択します。シングルスレッド環境では、コードをそのまま使用できます。選択した ID をアプリケーション コードの変数に抽出し、WHERE 句の UPDATE クエリに渡します。 write ステートメントは 1 つだけなので、トランザクションも必要ありません。これを SQLscript で真似ることができます。
これがあなたの現在のステータスであると仮定します:
リーリー次のキューに入れられたジョブ (id=2) を開始したいと考えています。
リーリーあなたは得ます
リーリー最後の選択から開始します。テーブルのステータスは次のようになります:
リーリーDB Fiddle で見る
ジョブを起動するプロセスが複数ある場合は、
上記のステータスから開始すると、ジョブ 2 はすでに実行中です:FOR UPDATE
を使用して行をロックする必要があります。ただし、LAST_INSERT_ID()
を使用すると、この状況を回避できます。リーリー
次のものが得られます:リーリー
新しいステータスは次のとおりです:リーリー
DB Fiddle で見る
UPDATE ステートメントがどの行にも影響を与えなかった (キューに入れられた行がない) 場合、ROW_COUNT()
私が気づいていないリスクがいくつかあるかもしれませんが、それは私の実際のアプローチ方法でもありません。むしろ、より多くの情報をは
0になります。
jobs
現在実行中のジョブは特定のプロセスに属しており、テーブルに保存したいと考えています。簡単な例:
リーリー ###そして### リーリーを使用するだけで選択できます。 リーリー
もっと知りたいかもしれません - 例:queued_at
、started_at
、
finished_at。
今週、私はあなたのケースと非常によく似たものを実装します。複数のワーカー。それぞれが一連の行の「次の行」を取得して作業します。
疑似コードは次のとおりです:
リーリーFOR UPDATE
を使用することは、競合状態 (つまり、複数のワーカーが同じ行を取得しようとすること) を回避するために重要です。SELECT ... INTO の詳細については、https://dev.mysql.com/doc/refman/8.0/en/select-into.html
を参照してください。