SQL Server で行レベルおよびページ レベルのロックをオフにする方法はわかりますが、SQL Server で行レベルのロックを強制的に使用する方法が見つかりません。SQL Server に強制的に行レベル ロックを使用させ、ページ レベル ロックを使用させない方法はありますか?
3 に答える
ROWLOCK ヒントを使用できますが、リソースが不足している場合、AFAIK SQL はそれをエスカレートすることを決定する場合があります。
ROWLOCK ページまたはテーブルのロックが通常行われるときに、行ロックが行われることを指定します。SNAPSHOT 分離レベルで動作するトランザクションで指定された場合、UPDLOCK や HOLDLOCK などのロックを必要とする他のテーブル ヒントと ROWLOCK を組み合わせない限り、行ロックは取得されません。
と
行レベルのロックを取得するロック ヒント ROWLOCK、UPDLOCK、および XLOCK は、実際のデータ行ではなく、インデックス キーにロックを配置する場合があります。たとえば、テーブルに非クラスター化インデックスがあり、ロック ヒントを使用する SELECT ステートメントがカバリング インデックスによって処理される場合、ベース テーブルのデータ行ではなく、カバリング インデックスのインデックス キーでロックが取得されます。
そして最後に、これは SQL Server 2008 で変更された SQL Server 2005 のロック エスカレーションについてかなり詳細な説明を提供します。
また、非常に詳細な内容もあります。 データベース エンジンのロック(オンラインの本)
だから、一般的に
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93
問題はありませんが、サーバーのインデックスと負荷によっては、ページ ロックにエスカレートする可能性があります。
ALTER/CREATE INDEXの ALLOW_PAGE_LOCKS 句を使用します。
ALTER INDEX indexname ON tablename SET (ALLOW_PAGE_LOCKS = OFF);
オプティマイザーに何かを強制することはできませんが、ガイドすることはできます。
UPDATE
Employees WITH (ROWLOCK)
SET Name='Mr Bean'
WHERE Age>93