SQL Server のデッドロックとは何ですか? また、いつ発生するのですか?
デッドロックの問題とその解決方法
SQL Server のデッドロックとは何ですか? また、いつ発生するのですか?
デッドロックの問題とその解決方法
一般に、デッドロックとは、2 つ以上のエンティティが一部のソースをブロックしており、循環的にソースをブロックしているため、いずれのエンティティも終了できないことを意味します。
1 つの例: テーブル A とテーブル B があり、A と B で更新を行う必要があり、使用時に両方をロックすることにしました (これは本当にばかげた動作ですが、現在は目的を果たしています)。 )。同時に、別の誰かが同じことを逆の順序で実行します。最初に B をロックし、次に A をロックします。
時系列的に、これは起こります:
proc1: ロック A
proc2: ロック B
proc1: B をロック - proc2 が B を解放するまで待機を開始
proc2: ロック A - proc1 が A を解放するまで待機を開始します
どちらも決して終わらない。それはデッドロックです。実際には、クエリが永久にハングすることは望ましくないため、これは通常、タイムアウト エラーを引き起こします。基盤となるシステム (データベースなど) は、時間内に終了しないクエリを強制終了します。
デッドロックの実際の例の 1 つは、家の鍵を車にロックし、車のキーを家にロックした場合です。
デッドロックは、実行するために 2 人のユーザーが複数のリソースを必要とする場合に発生し、一部のリソースが各ユーザーによってロックされている場合に発生します。これは、A が B が持っているものなしでは実行できないという事実につながり、逆もまた同様です。
Person A と Person B がいるとします。実行するには、両方とも 2 つの行 (Row1 と Row2) を取得する必要があります。
Person A は Row2 が必要なため実行できません。Person B は Row1 が必要なため実行できません。相手が必要とするものをロックしているため、どちらの人も実行できず、その逆も同様です。
デッドロックを減らす合理的で簡単な方法の 1 つは、すべての複雑なトランザクションで、操作を同じ順序で行うことです。つまり、Table1 にアクセスしてから Table2 に同じ順序でアクセスします。これにより、発生するデッドロックの数を減らすことができます。
2 つ (またはそれ以上) のトランザクションがそれぞれ、他のトランザクションによって保持されているロックの解放を待機している場合に発生する可能性のある行き詰まり。