最近、ASP.NETアプリケーションの1つがデータベースデッドロックエラーを表示し、エラーをチェックして修正するように要求されました。デッドロックの原因は、カーソル内のテーブルを厳密に更新しているストアドプロシージャであることがわかりました。
このエラーを見たのはこれが初めてで、効果的に追跡して修正する方法がわかりませんでした。私が知っているすべての可能な方法を試してみましたが、最終的に、更新されているテーブルには主キーがないことがわかりました!幸いなことに、これはID列でした。
後で、展開用のデータベースを台無しにした開発者を見つけました。主キーを追加し、問題は解決しました。
私は幸せを感じて、私のプロジェクトに戻って、そのデッドロックの理由を見つけるためにいくつかの研究をしました...
どうやら、デッドロックを引き起こしたのは循環待機状態だったようです。更新は、主キーの場合よりも主キーなしの方が明らかに時間がかかります。
明確に定義された結論ではないことを知っているので、ここに投稿しています...
- 主キーの欠落が問題ですか?
- (相互排除、保留と待機、プリエンプションなし、循環待機)以外のデッドロックを引き起こす他の条件はありますか?
- デッドロックを防止および追跡するにはどうすればよいですか?