ロックエスカレーションとは何ですか?


47

私はインタビューでこの質問をされたが、答えはなかった。ここで誰か説明できますか?

回答:


45

DBロックは、行、ページ、またはテーブル全体またはインデックスに存在できます。トランザクションが進行中の場合、トランザクションによって保持されているロックがリソースを占有します。ロックのエスカレーションは、システムが複数のロックをより高いレベルのロックに統合する場所です(たとえば、複数の行ロックをページに統合したり、複数のページをテーブル全体に統合したりする)。

これは自動的に行われますが、テーブルにフラグを設定して(オンラインブックのALTER TABLEを参照)、その特定のテーブルのロックエスカレーションのポリシーを制御できます。特に、SybaseとSQL Serverの古いバージョンでは、2つのプロセスが別々の行を同じページに同時に書き込んでいたときに、ロックのエスカレーションが早すぎるか、過度に問題でした。十分に戻った場合(IIRC SQL Server 6.5)、SQL Serverには実際には行ロックがなく、テーブルまたはページのみをロックできました。この場合、同じページにレコードを挿入する間で競合が発生する可能性があります。多くの場合、テーブルにクラスター化インデックスを配置して、新しい挿入が別のページに送られるようにしました。


3
サーバーがエスカレートするタイミングを制御できないことにも注意してください。

今やる。T1211を呼び出します。
ジョシュア

@Joshua、トレースフラグ1211はロックエスカレーションを無効にするために使用されます。特定の時間にエスカレートするようにSQL Serverに指示する方法はありません。
ちょうど学習者

10
行ロックはページロックにエスカレートされず、テーブルロックに直接エスカレートされます。
マノジパンディ

マノジが言ったことは本当です。回答のその部分を修正して、経験の浅いSQL Serverユーザーの誤解を招かないようにしてください
NikolaD

20

これは、多くのきめの細かいロックをより少ないきめの粗いロックに変換することにより、システムのオーバーヘッドを削減する方法です。より詳細な情報は、ここここにあります

たとえば、テーブル内の特定の行に多数(通常は数百以上)のロックがある場合、ロックの最大許容数を超えると、テーブル全体のロックと交換される可能性があります。


11

SQL Serverは、いくつかの細粒度の低レベルロックを粗粒度の高レベルロックに変換することにより、メモリオーバーヘッド削減するためにロックエスカレーション行います

  • 行ロックは常にテーブルロックにエスカレートされます。
  • ページロックもテーブルロックにエスカレートされます。

これは、ある行ロックは、ページ・ロックにエスカレートしていることを神話間違っている@ConcernedOfTunbridgeWellsによって上記と同じ。

テーブルの行更新が非常に少ない場合、SQLエンジンはそれらの行の行ロックまたはそれらのページのページロックの取得を試みます。Row-Lockを使用したとしましょう。ただし、行の更新によってしきい値(〜5kロック)が増加すると、複数の行ロックを取得する代わりに、単一のテーブルロックが取得されます。したがって、これにより、複数の行ロックを解放し、単一のテーブルロックを取得することでメモリのオーバーヘッドが削減されますが、同時実行性は向上します。ページロックでも同じことが起こります。

ロックのエスカレーションのしきい値は、ロック・エスカレーションの詳細な説明はMSDN BOLにここで言及された時、少なくとも5000個のロックで、いくつかの要因に依存します。https://technet.microsoft.com/en-us/library/ms184286(v = sql.105).aspx


5

ロックのエスカレーションとは、ロックをより制限的なモードに変換することです。これは、データベースで最もよく見られます。クエリには、「共有」のためにロックされたリソースがあり、それを「排他的」にエスカレートして更新を実行する場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.