SQL Serverで行レベルロックを強制することは可能ですか?
-
29-09-2019 - |
質問
SQL Serverで行レベルとページレベルのロックをオフにする方法を見ることができますが、SQL Serverに行レベルのロックを使用するように強制する方法は見つかりません。 SQL Serverに行レベルのロックを使用し、ページレベルのロックを使用しないように強制する方法はありますか?
解決
Rowlockのヒントを使用できますが、AFAIK SQLはリソースが少ない場合にエスカレートすることを決定する場合があります
ドコから:
Rowlockは、ページまたはテーブルロックが通常撮影されたときに行ロックが撮影されることを指定します。スナップショット分離レベルで動作するトランザクションで指定されている場合、RowLockがUpdlockやHoldLockなどのロックを必要とする他のテーブルヒントと組み合わされない限り、行ロックは撮影されません。
と
ロックヒントRowlock、Updlock、およびXlockは、行レベルのロックを取得すると、実際のデータ行ではなくインデックスキーにロックされる可能性があります。たとえば、テーブルに非クラスター化されたインデックスがあり、ロックヒントを使用した選択ステートメントがカバーインデックスによって処理される場合、ベーステーブルのデータ行ではなく、カバーインデックスのインデックスキーにロックが取得されます。
そして最後に これにより、SQL Server 2008で変更されたSQL Server 2005のロックエスカレーションに関するかなり詳細な説明が得られます。
深さもあります: データベースエンジンのロック (オンラインの本で)
だから、一般的に
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
大丈夫ですが、サーバーのインデックスとロードに応じて、ページロックにエスカレートする可能性があります。
他のヒント
Alow_Page_Locks句を使用します インデックスを変更/作成します:
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
オプティマイザーに何かを強制することはできませんが、ガイドできます。
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93