2

リクエストの多いゲームのコーディングチームに所属しています。

最近、複数のリクエストがまったく同時に送信される可能性があり、シンジケーションの重複アクションであるといういくつかの問題が発生しました (完全に連続して実行された場合、これは発生しません)。

問題のあるルーチンは 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)
4

1 に答える 1

2

MySQL にはいくつかの異なるロックモードがあります

http://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html

更新/削除を実行するときに排他ロックを強制する必要があると思います。このようにして、後続のリクエストは、ロックが解除されて適切なアクションが完了するまで待機します。

これらの同時クエリに使用されているインデックスを調べることもできます。適切なインデックス作成体制は、特定のクエリ中にロックする必要がある行の数を最小限に抑えます。

于 2012-06-13T22:24:39.037 に答える