これは私が完全に習得したことがないものであり、私がそれを正しく行っているかどうかを知り、健全性をチェックしてもらいたい.
....
私はデータベースを持っていますlinks
、それをシンプルに保ちましょう、2列
ID int(10) PK, Status enum('ready', 'in progress', 'complete'); 1「準備完了」 2「準備完了」 3「準備完了」
....
次に、クエリが「準備完了」アイテムの ID を返す API を用意しました。この API は同時に何度も呼び出すことができ、ID が 1 回だけ発行されるようにしたいと考えています。
....
API MySQL クエリ..
LOCK TABLES `links` WRITE SELECT ID FROM links WHERE status = 'ready' LIMIT 1 // 準備完了を取得 UPDATE links SET status = 'in progress' WHERE ID = 'X' // 上記の行から取得したものを更新して進行中 (別の API 呼び出しでは選択されない) テーブルのロックを解除
そのため、2 つの API 呼び出しが 0.01 秒間隔でヒットした場合、最初の呼び出しでテーブルをロックして進行中の状態に更新し、ロックを解除した後、2 番目の呼び出しでチャンスを得て同じことを行いますが、最初の呼び出しとは異なる ID を選択します。
これは正しいです?またはそのようなことを行うための最良の方法は?一部のクエリが 5 分程度待機することで MySQL トラフィックに長い遅延が発生し、その後 MySQL が最大接続数に達し、他のあらゆる種類の問題が発生するようです。
テーブルは InnoDB で、約 165,000 行と比較的小さく、ステータスのインデックスがあります。アドバイスやポインタを事前にありがとうございます。