web-dev-qa-db-ja.com

更新ステートメントに同じ順序でページロックを強制しますか?

同じテーブルに、異なる順序でページロックを取得する2つの更新ステートメントがあります。これはデッドロックにつながります。

  • プロセスAは、ページ1で更新ロックを所有し、ページ2で更新ロックを要求します。
  • プロセスBは、ページ2の更新ロックを所有しており、ページ1の更新ロックを望んでいます。

両方のステートメントに同じ順序でページロックを強制する方法を教えてください。

2
Rainbolt

両方のステートメントに同じ順序でページロックを強制する方法を教えてください。

できません。代わりに、両方にTABLOCKXヒントを使用してテーブルロックを強制するか、または Application Lock を使用してセッションをシリアル化します。

SQLステートメントでページアクセスシーケンスを強制できます。あなたはmay同じ検索順序を持つ各クエリのプランを見つけて、プランガイドを適用できます。 IIRCこれは単なる提案であり、実行エンジンは実行時にそれを使用しない場合があります。

これらのページの行がロックされているため、ページにアクセスしてロックします。行が(カーソルなどで)タッチされる順序を強制できる場合は、this問題が解決されます。もちろん、今は他の問題があります。

おそらく、2つのクエリが同じ行を操作していません。 SQL Serverは行ロックをサポートしています。それに応じてテーブルとインデックスを定義する必要があります。

0
Michael Green