SQL-Server 2008でUPDLOCK
ヒントを調査していたところ、特定のデッドロックシナリオを回避するのに非常に役立つことがわかりました。これらのタイプのロックヒントを使用すると、常にいくつかの副作用がありますが、このヒントは見つかりませんでした。
それで、すべてのupdate
クエリで使用するとどうなりますか?私はselect
について話しているのではなく、update
について話しているだけです。それは私にどのような悪影響を及ぼしますか?
すべての更新クエリで使用するとどうなりますか?
すべてのヒントと同様に、UPDLOCK
は明確な利点がある場合にのみ使用してください。
それは私にどのような悪影響を及ぼしますか?
クエリと実行プランによって異なります。ターゲットテーブルにUPDLOCK
を追加することのみを提案していると仮定すると、非常に単純なケースではまったく悪影響がありません。
「非常に単純なケース」は、どの行が条件を満たすかについてall決定が単一のプラン演算子で行われる場合です。この状況では、更新ロックは確実に適格となる行でのみ行われるため、害はありません。
SQL Serverは、U
ヒントがなくても対象となる行を検索するときにUPDLOCK
ロックを自動的に取得しますが、主なアクセス方法(たとえば、インデックスシークおよび関連するRIDまたはキールックアップ)に対してのみです。これらの自動U
ロックは特別です。計画の後半のオペレーターが結局行が適格でないと判断した場合でも、SQL Serverはそれらを早期に解放できます。
UPDLOCK
が指定されている場合、計画の他の演算子が行が実際に更新に適格でないと判断した場合でも、トランザクションが終了する前に、取得された更新ロックを解放できません。これらの追加のU
ロックは同時実行性を低下させ、テーブル排他ロックへのロックエスカレーションを引き起こす可能性があります。
これらの理由により、UPLOCK
クエリでUPDATE
を定期的に指定することは、一般的にはお勧めできません。