私は 2 つの SPID をトランザクションとして実行しています。以下は、それぞれがとりわけ行うことです。
SPID A -
- テーブル 1 の行 1 ~ 10 を更新します
- .......
SPID B -
- テーブル 1 の行 5 を更新します
- テーブル 1 から行 4、5、および 6 を選択し、テーブル 2 の行を更新します。
- ……
- ……
SPID A が行 4 を更新し、クラスター化インデックスの X ロックを待って行 5 を更新し、SPID B が手順 2 で、X にある行 4 のクラスター化インデックスの S ロックを待機しているデッドロック シナリオに直面しています。 SPID A によるロック。テーブル 1 にも非クラスター化インデックスがありますが、選択クエリをカバーしていないため、クラスター化インデックスを検索します。私はそれをカバリング インデックスにしても、SPID A は非クラスター化インデックスのロックを保持し、SPID B を待機させると想定しています。SPID Bが行5への更新をすでに開始している場合、多かれ少なかれテーブル全体を更新しているSPID Aがロックを取得するのを待たなければならないように、分離レベルをシリアライゼーションにエスカレートすることを検討しています。また、SPID Bを防ぎますSPID A が既に開始されている場合は、x ロックを取得できません。
この行き詰まりを解消するために、他に何か提案はありますか? ありがとう。