ロックのエスカレーション
ロックのエスカレーションは、行などの粒度が細かい多数のロックを、テーブルなどの粒度が粗い少数のロックに変換する処理です。ロックのエスカレーションを使用すると、システムのオーバーヘッドが減少します。
Microsoft SQL Server Compact 3.5 では、トランザクションがエスカレーションのしきい値を超えると、行ロックとページ ロックが自動的にテーブル ロックにエスカレートされます。SQL Server Compact 3.5 では、ロックが行からテーブルに、またはページからテーブルにエスカレートされることはありますが、行からページにエスカレートされることはありません。エスカレーションがテーブル レベルで発生した場合、テーブルより粒度が細かいロックは要求できません。
たとえば、あるテーブルの行に対してトランザクションが実行されると、SQL Server Compact 3.5 では影響を受ける行のロックが自動的に取得され、それらの行を含むページやテーブルに高いレベルのインテント ロックが適用されます。また、関連するすべてのインデックス ページがロックされます。トランザクションで保持されるロックの数がしきい値を超えると、SQL Server Compact 3.5 ではテーブルのインテント ロックがより強力なロックに変更されます。たとえば、インテント排他 (IX) ロックは排他 (X) ロックに変更されます。より強力なロックを取得した後、テーブルでトランザクションによって保持されているページ レベルのロックと行レベルのロックがすべて解除されます。
ロックのエスカレーションは、ロックの要求が原因でロックのエスカレーションの指定されているしきい値を超えたときに、テーブル単位で発生します。サブテーブル レベルのすべてのロックは、種類に関係なく、しきい値に対してカウントされます。内部操作で必要なすべてのロックがエスカレーションのしきい値に対してカウントされるので、そのしきい値のみを概算値と見なす必要があります。エスカレーションは、予想より早く発生します。
ロックの競合により、エスカレーションが発生しない場合は、トランザクションによってエスカレーションが続行されるか、後から再びエスカレートされます。
注意
インテント ロック、行ロック、およびページ ロックはすべて、一時的なテーブル ロックでない限り、エスカレーション回数としてカウントされます。特定のテーブルのインテント ロック、行ロック、およびページ ロックの合計がエスカレーションのしきい値を超えると、エスカレーションが発生します。
次のコード例で示すように、ロックのエスカレーションのしきい値を設定すると、セッションごとにロックのエスカレーションを制御できます。
SET LOCK_ESCALATION 1000;
この設定は、データベース内のすべてのテーブルに影響します。既定値は 100 です。