リクエストの多いゲームのコーディングチームに所属しています。
最近、複数のリクエストがまったく同時に送信される可能性があり、シンジケーションの重複アクションであるといういくつかの問題が発生しました (完全に連続して実行された場合、これは発生しません)。
問題のあるルーチンは InnoDB テーブル内の行を呼び出し、存在する場合は、他のすべてのチェックが正常になるまでそのルーチンを続行し、その時点で完了して行を削除します。
発生しているように見えるのは、(行レベルのロックにもかかわらず) 読み取りが同時に行にヒットし、ルーチン パスを継続しているため、その時点では削除に違いはありません。これが起こっているのは、運を試すのに十分賢いプレーヤーによってルーチンが複製されているということです.
これを修正する方法について誰か提案がありますか?
ルーチンの例。
// check database row exists (create the initial lock)
// proceed
// check quantity in the row
// if all is okay (few other checks needed here)
// delete the row
// release the lock either way (for the next request to go through)