デッドロック
デッドロックとは、プログラムが処理を続けるために必要なリソースにアクセスできない状態です。アクティブなアプリケーションがデッドロックに陥ると、「ハング」したり、応答しなくなったりすることがあります。
保存されたデータやキャッシュされたデータなどのリソースは、プログラム内の特定のプロセスからアクセスされたときにロックされることがあります。データをロックすると、ほかのプロセスがデータを早まって上書きするのを防げます。プロセスやクエリがロックされたデータにアクセスする必要があるのに、そのデータをロックしているプロセスがロックを解除しない場合、デッドロックが発生することがあります。
たとえば、次の状況では2つのプロセス間でデッドロックが発生します。
- プロセス1がプロセス2にリソースBを要求する。
- プロセス2の実行中は、リソースBがロックされている。
- プロセス2は実行を完了するために、プロセス1のリソースAを必要とする。
- プロセス1の実行中は、リソースAがロックされている。
その結果、プロセス1とプロセス2は互いの処理が完了するのを待つことになります。どちらのプロセスも、もう一方のプロセスが完了するまで処理を続けられないため、デッドロックが発生します。
デッドロックの回避
開発者は、プログラムのロジックでロックが発生する状況を避けることにより、デッドロックを防止できます。たとえば、2つのプロセスが互いに依存するのではなく、別のスレッドがリソースを必要とする前に各スレッドの処理が完了するようにソースコードを記述できます。必要なときにデータへアクセスできるようにすることで、プログラマーはアプリケーションがハングしたりクラッシュしたりするのを防げます。
NOTE: 2つ以上のクエリをデータベースで実行したときにも、デッドロックが発生することがあります。トランザクションデータベースはアクティブなレコードをロックし、ほかのクエリがそのレコードにアクセスできないようにします。プロセスがロックされたレコードにアクセスできない場合、データベースのデッドロックが発生することがあります。
知識をテストする