0

並列スレッドから2つのSQL ServerテーブルでCRUDを実行しているときに、ここでは詳細なシナリオを示します。SQL Azure - トランザクション(プロセスID 160)が別のプロセスとロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました

私たちは100-150並列スレッドでコードブロックをスピンアップするデスクトップアプリケーションを持っています。コードブロックはSQL Bulk Copyを使用してTableAに挿入し、3つのストアドプロシージャストアドプロシージャはTableAからのいくつかの選択に基づいてTableBの挿入、更新および削除を行います。

すぐにアプリケーションがスレッドの実行を開始すると、SQL Serverはスレッドの一部が正常に動作している間に、特定の数のスレッドに対して上記のデッドロック例外をスローします。

例外メッセージ: トランザクション(プロセスID 160)が別のプロセスでロックリソースにデッドロックされ、デッドロックの対象として選択されました。トランザクションを再実行します。

この点に関する助けは、前もって理解されています。

ありがとうございました。

答えて

0

トランザクション(プロセスID 160)が別のプロセスでロックリソースにデッドロックされているというメッセージがはっきりとわかります。ロックは異なるレベルにある可能性があります。他のスレッドがその特定のリソースをロックする前に、ロックは解放されません。プロセスIDを強制終了し、ロックの競合があればワークフローを確認してください。

+0

はい、同じオブジェクト(2つのテーブルの1つ)にアクセスする際に競合が発生しますが、複数のスレッドが同じテーブルに同時にアクセスできるようにデッドロックを回避するにはどうすればよいですか?データベースレベルまたはストアドプロシージャレベルの設定はありますか? –

+0

同じ順序でオブジェクトにアクセスします。 トランザクションを短く1つのバッチにまとめます。 低い分離レベルを使用してください。 行のバージョン管理ベースの分離レベルを使用します。 ... バインドされた接続を使用します。 –

2

このSQL ServerまたはSQL Azure/Azure SQL DBですか?それが "ボックス" SQL Serverの場合は、ALTER DATABASE SET READ_COMMITTED_SNAPSHOTをONにしてください。これにより、バージョンの読み込みが有効になります。この状態ではまだデッドロックが発生する可能性がありますが、それはあなたが得る可能性のある銀色の弾丸に近いです。

読むのバージョンは、いくつかの微妙な方法で同時実行モデルを変更するので、最初にそれについて読むと、それはあなたのビジネスロジックと互換性のあることを確認してください:https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx

そうでない場合は、トランザクションのスコープを最小化についてSrivatsの他の提案は、常にではありません実装は簡単ですが、まだ実用的です。そのリストには、次のように追加します。よく索引付けされた照会アクセス・パスがあることを確認し、トランザクション内の照会のいずれも全表スキャンまたは索引スキャンを必要としないことを確認します。

+0

これはSQL Azureデータベースです。ガイドラインのおかげで、私たちはすでにデータベースレベルの分離とトランザクションレベルの分離の両方を試みましたが、何も動作していないようです。 –

+0

スナップショットの隔離を有効にすると、問題が解決しました。ありがとうございました! @KamalHaider私はまた、私の選択句に "(nolock)"を持っています、これがあなたを助けてくれることを願っています! – Bruce

関連する問題