私はここで問題を説明しました: ReadCommited ILの下でのデッドロック と答えを得ました:
So a deadlock can occur when running SELECTs because the transaction running
those selects had acquired write locks before running the SELECT.
さて、これを取り除くにはどうすればよいでしょうか?カバーされたインデックスを追加したり、SQL コマンド テキストを変更する分離レベルを変更したり、テーブル ヒントを使用したりすることで解決できる一般的なタイプのデッドロックがいくつかありますが、私の場合は適切な解決策が思いつきません。
これがデッドロックの最も一般的で最も簡単な理由のようです。
- プロセスAがリソースR1のロックを取得し、プロセスBがリソースR2のロックを取得します。
- プロセスAはリソースR2が解放されるのを待ち、プロセスBはR1を待ちます。
したがって、これは主に並列処理の問題であり、おそらくビジネス ロジックでもあります。
ロックが行に適用されていればデッドドックを回避できるかもしれませんが、ページ内にいくつかの行ロックがあり、ロックのエスカレーションが発生してページ全体がロックされているようです。
何をアドバイスしますか?ロックエスカレーションを無効にしますか? 1回の取引でローカルにできますか? または、テーブルヒント(WITH ROWLOCK)または何かを適用するかもしれません... idk
現在、分離レベルをスナップショット (またはその他のタイプ) に変更することはできません。ありがとう。