並列スレッドから2つのSQL ServerテーブルでCRUDを実行しているときに、ここでは詳細なシナリオを示します。SQL Azure - トランザクション(プロセスID 160)が別のプロセスとロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました
私たちは100-150並列スレッドでコードブロックをスピンアップするデスクトップアプリケーションを持っています。コードブロックはSQL Bulk Copyを使用してTableAに挿入し、3つのストアドプロシージャストアドプロシージャはTableAからのいくつかの選択に基づいてTableBの挿入、更新および削除を行います。
すぐにアプリケーションがスレッドの実行を開始すると、SQL Serverはスレッドの一部が正常に動作している間に、特定の数のスレッドに対して上記のデッドロック例外をスローします。
例外メッセージ: トランザクション(プロセスID 160)が別のプロセスでロックリソースにデッドロックされ、デッドロックの対象として選択されました。トランザクションを再実行します。
この点に関する助けは、前もって理解されています。
ありがとうございました。
はい、同じオブジェクト(2つのテーブルの1つ)にアクセスする際に競合が発生しますが、複数のスレッドが同じテーブルに同時にアクセスできるようにデッドロックを回避するにはどうすればよいですか?データベースレベルまたはストアドプロシージャレベルの設定はありますか? –
同じ順序でオブジェクトにアクセスします。 トランザクションを短く1つのバッチにまとめます。 低い分離レベルを使用してください。 行のバージョン管理ベースの分離レベルを使用します。 ... バインドされた接続を使用します。 –