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