一般に、デッドロックとは、2 つ以上のエンティティが一部のソースをブロックしており、循環的にソースをブロックしているため、いずれのエンティティも終了できないことを意味します。
一例:テーブル A とテーブル B があり、A と B で更新を行う必要があり、使用時に両方をロックすることにしました (これは本当にばかげた動作ですが、現在は目的を果たしています)。 )。同時に、他の誰かが逆の順序で同じことを行います - 最初に B をロックし、次に A をロックします。
年代順に、これが起こります:
proc1:ロック A
proc2:ロック B
proc1:B をロック - proc2 が B を解放するまで待機を開始
proc2:A をロック - proc1 が A を解放するまで待機を開始
どちらも決して終わることはありません。それはデッドロックです。実際には、クエリが永久にハングすることは望ましくないため、通常はタイムアウト エラーが発生し、基盤となるシステム (データベースなど) は時間内に終了しないクエリを強制終了します。
デッドロックの実際の例の 1 つは、家の鍵を車にロックし、車のキーを家にロックした場合です。