データベースエンジンが取得するさまざまな種類のロックについて詳しく知りたい。
これらの概念を理解してください。
行ロック
行ロックは、SQL Serverで可能なロックの最小レベルの粒度です。これは、1つまたは複数の特定の行がロックされることを意味し、隣接する行は同時クエリによるロックに引き続き使用できます。
ページロック
SQL Serverのページロックは、クエリがページから10バイトしか必要としない場合でも、8Kのデータをロックします。したがって、クエリは、クエリで要求しない追加データをロックします。
Hobt Lock
テーブルが「 SQL Server Table partitioning 」でパーティション化されている場合、単一のパーティションがロックされる可能性があります(HobtはヒープまたはBツリーを表します)
注:HOBTロックへのロックエスカレーションはデフォルトで無効になっています。 ALTER TABLE MyTable SET (LOCK_ESCALATION = AUTO)
を実行して、HOBTロックエスカレーションを有効にします。
テーブルロック
テーブルロックは、テーブル全体をロックします。
データページとは
Microsoft SQL Serverは、8K相当のデータを保持できる「データページ」にすべてのデータを整理します。これは、SQL Server 8Kのデータアクセスでは情報が読み取られることを意味します。
データページには1つのテーブルからの情報のみを含めることができ、ページのレイアウトは MSDNで詳しく説明されています
SQL Serverが常に完全なデータページを常に読み取るという事実は、ページレベルのロックを使用する理由を示しています。ページレベルのロックの意味するところは、予想よりもはるかに多くのデータをロックする可能性があるということです。
たとえば、フィールドID
にクラスター化インデックスを持つ合計レコードサイズが1024バイトのテーブルがあると仮定します。次のクエリを実行すると:SELECT * from MyTable (xlock) where ID = 123
はそのレコードがロックされるだけでなく、(ページの塗りつぶしに応じて)最大3つの追加レコードもロックされます。
これらのロックはいつ取得されますか
クエリはクエリガバナによって解析され、必要なロックが決定され、ロックマネージャから要求されます。 SQL Serverは、ロック戦略を決定するために、パフォーマンスと競合のバランスをとろうとします。
SQL Serverは、「ロックエスカレーション」システムに従います。これにより、特定のタイプの5000を超えるロックが取得されている場合に、ロックの粒度が低下します。詳細については、 ロックエスカレーションに関するこの記事 を参照してください。
この動作は、テーブルごとに指定できるクエリで、 hints にロックヒントを使用して微調整できます。どんな種類のロックを好むでしょうか。 SQL Serverは要求を尊重しようとしますが、ロックエスカレーションを適用します。