2

私はこのデッドロックで髪を引っ張ってきました:

デッドロック

拡大

IX_OrderAmounts は、Amount テーブルで集計を行うインデックス付きビューです。左側のトランザクション (反復可能な読み取り - コミットされた読み取りでも同じことが起こります) は、Amount テーブルに 1 つの行のみを挿入します。右側のトランザクション (コミットされた読み取り) は、Amount テーブルからいくつかの行 (2 ~ 3 行) を更新します (すべて 1 つの UPDATE ステートメントで)。

ここで、行を挿入するだけでよい左側のトランザクションが、2 番目の更新ロックを取得する必要がある理由がわかりません。

デッドロックは、直接更新しないインデックス付きビューにあるため、SQL ヒントを実際に使用することはできません (または、少なくとも方法がわかりません)。

このデッドロックを解決するにはどうすればよいですか?

4

1 に答える 1

2

デッドロックを解決するために使用できる一般的な方法は次のとおりです。

  • インデックスの追加と削除。
  • インデックス ヒントの追加。
  • 同様のパターンでリソースにアクセスするようにアプリケーションを変更します。
  • トリガーなどのトランザクションからアクティビティを削除します。
  • トランザクションをできるだけ短くします。

    SQL Server では、次のいずれかを使用して、コミットされていないデータ変更のダーティ リードからトランザクションを保護しながら、ロックの競合を最小限に抑えることもできます。

    • READ_COMMITTED_SNAPSHOT データベース オプションが ON に設定されたREAD COMMITTED 分離レベル。
    • SNAPSHOT 分離レベル。

ロックに重点を置いて SQL プロファイラーを読み込み、その DB に特化してデッドロックするスクリプトを開始し、それをデータベース エンジン チューニング アドバイザにフィードして、提案を確認します。

脚注: http://support.microsoft.com/kb/832524

[[1]: http://support.microsoft.com/kb/832524

http://www.codeproject.com/Articles/42547/SQL-SERVER-How-To-Handle-デッドロック

以前の Stackoverflow ロックに関する質問:デッドロックの問題を解決するにはどうすればよいですか?

于 2013-02-09T15:52:10.110 に答える