84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
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
を参照してください。