0
私は同時労働者間の行を配布するために、このクエリを使用します。このクエリでデッドロックが発生するのはなぜですか?
SET @update_id := 0;
UPDATE tablename
SET processed = -1, id = (SELECT @update_id := id)
WHERE processed = 0
LIMIT 1
SELECT @update_id as id;
時にはそれがデッドロック例外を投げたし、私はそれを再起動しました。しかし、労働者数が十分に高いと、ほとんど毎回デッドロックが発生し、リトライ・ループに巻き込まれるようになります。正しく書き直すには?
これは正しく動作するはずですか? selectサブクエリが返された後、更新が行われる前に行が変更された場合はどうなりますか? 0行が変更された場合、戻り値をチェックして再クエリを実行する必要がありますか? – Poma
'AND processed = 0'はそれを防ぐべきです。 はい、0行が変更された場合や0が返された場合は、クエリを再起動する必要があります。 'processed = 0'の行があることを確認する必要があるかもしれないので、無限ループはありません。 代わりに、-1の代わりにProcessIdを設定すると、事態を簡単にすることができます。いずれの場合も、クラッシュしたプロセスに対処する必要があります。 'update tn set processed =処理済み= 0の制限1; どこから処理されたかを選択します。= ' –
'一般的なエラー:1093 FROM句で更新対象テーブル 'tablename'を指定することはできません。 ' – Poma