デッドロックの助けが必要です
-
25-09-2019 - |
質問
私には独特の状況があります。コードのさまざまな部分と数千のクライアントが常にアクセスできるテーブルがあるため、テーブルに簡単な更新や挿入を行うときにトランザクションの使用を採用しました。問題は、デッドロックエラーを取得し続けることです。誰もがこの問題をどのように軽減できるか考えていますか?
解決
デッドロックは、多くの理由とその組み合わせで発生する可能性があります。
スキーマのデザインが悪い
クエリワークロードの誤ったインデックス
不十分に書かれたtsql
積極的なトランザクション分離レベルおよび/または長期走行オープントランザクション
アプリケーションアクセスパターンが悪い
低スペックまたは誤って構成されたハードウェア
これらはすべて一般的です。
読むことをお勧めします
他のヒント
この問題はあまりにも独特ではありません。開発者がロックの仕組みについてあまり知らない場合は典型的です。トランザクションを「ブラックボックス」と考え、ソリューションがスケーリングされることを期待しています。
ミッチは、専門家である人にお金を払うことについてのコメントで正しいです。これは、あらゆる解決策には大きすぎる問題です。デッドロックを引き起こすクエリの痕跡で武装する必要があり、インデックスからテーブル設計、トランザクション分離レベル、クエリパターンまで、すべてを分析する必要があります。
SQL Server Profilerから始めて、デッドロックグラフを生成するトレースを設定することをお勧めします。これにより、少なくとも問題のクエリとデッドロックのリソースが特定されます。遅いクエリ(>たとえば100ms)を探して別のトレースを設定し、それらをスピードアップします。クエリの実行が長いほど、ロック競合の確率が高くなります。