1

いくつかのテストの結果を保存するために使用されるデータベースを構築しようとしています。問題は、これらのテストが並行して別々のプロセスで実行され、それぞれが終了した後に結果をデータベースにコミットすることです。MySQL はそのような状況を処理するように設計されており、InnoDB などの一部のエンジンは行レベルのロックを実現できることがわかりました。

  1. プロセスがロックされたテーブルまたはエントリにアクセスする場合、これはプロセスがブロックされ、テーブルまたはエントリがロック解除されるまでポーリングされますか、またはクエリがキャッシュされ、プロセスが正常に終了できるようになりますか?
  2. サーバーがダウンしているときにプロセスがサーバーに接続しようとすると、何が起こるか、それを処理するのは私次第ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

2

番号 2 はあなた次第ですmysql_connect()。データベースへの接続に使用するときに何をするか、または何を使用しても例外がスローされます。一番の問題は、ロックされたテーブルまたは行に対してプロセスが何をする必要があるかに応じて、MySQL レベルで解決されます。通常、これにより、クエリがロックされた領域のデータにアクセスするための一時的な遅延が発生しますが、他のプロセスがテーブル/行を長時間ロックすると、タイムアウト エラーが返される可能性があります。また、プロセス A が行 1 をロックし、プロセス B が行 2 をロックし、A が行 2 からのデータを要求し、B が行 1 からのデータを要求するなど、相互ロックも可能です。これは「デッドロック」と呼ばれ、プロセスの 1 つが選択されます。デッドロックの犠牲者として、そのクエリは失敗を返します。

于 2013-07-25T09:55:21.830 に答える