この質問がここで尋ねられたことは知っていますが、1) 比較的古いものであり、2) あまり役に立ちませんでした。
データベースでいくつかの操作を行うと、比較的多数のデッドロックが発生します。セットアップは次のとおりです。
テーブル:
テーブル B への外部キーを持つテーブル A。
オペレーション:
テーブル A に挿入
テーブル B に挿入
テーブル B の行を更新する
テーブル B の行を削除
テーブル A の行を削除する
問題:
これらの操作は基本的に任意の順序で実行できます。複数のワーカー ロールがあるため、これらの操作は冪等でなければなりませんが、各ワーカー ロールはテーブル A の異なる主キーを使用して動作します。テーブルをロックし、私が理解していることから、Aを削除すると、最初にテーブルBがロックされ、そこにある関連する行が削除され、次にAから行が削除されます。現在、これはアトミック操作であり、その間に追加のロックを実行する時間がないと想定していますテーブル B をロックし、テーブル A をロックします。これを回避する方法が想像できないためです。
現在、Microsoft Visual Studio で次の形式の例外をキャッチできます。
トランザクション (プロセス ID xxx) は、別のプロセスとのロック リソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。
この例外は、上記の操作のいずれかで発生する可能性があるようです。
私の質問は次のとおりです。どのロック/トランザクションがデッドロックの原因であるかをどのように知ることができますか? 例外が発生した後に役立つクエリを知っている人はいますか?