私には独特の状況があります。コードのさまざまな部分と何千ものクライアントから常にアクセスされるテーブルがあるため、テーブルの単純な更新と挿入を行うときにトランザクションを使用しました。問題は、デッドロックエラーが発生し続けることです。誰かが私がこの問題をどのように軽減できるか考えていますか?
2 に答える
この問題はそれほど特殊なものではありません。開発者がロックの仕組みについてあまり知らず、トランザクションを「ブラックボックス」と見なし、ソリューションの拡張を期待している場合によく見られます。
ミッチは、専門家である誰かに支払うことについてのコメントに正しいです-これは、SOのどの解決策にも大きすぎる問題です。デッドロックを引き起こすクエリの痕跡を準備する必要があり、インデックスからテーブルデザイン、トランザクション分離レベル、クエリパターンまですべてを分析する必要があります。
SQL Server Profilerから始めて、デッドロックグラフを生成するトレースを設定することをお勧めします。これにより、少なくとも問題のクエリとデッドロックしているリソースが特定されます。遅いクエリ(>たとえば100ms)を探す別のトレースを設定し、それらも高速化します。クエリの実行時間が長いほど、ロックの競合の可能性が高くなります。
デッドロックは、多くの理由とその組み合わせで発生する可能性があります。
貧弱なスキーマ設計
クエリワークロードのインデックスが正しくありません
記述が不十分なTSQL
積極的なトランザクション分離レベルおよび/または長時間実行されるオープントランザクション
不十分なアプリケーションアクセスパターン
低スペックまたは正しく構成されていないハードウェア
これらはすべて一般的です。
読むことをお勧めします