web-dev-qa-db-ja.com

ラッチとロックの違い

最近、latch_ex待機タイプに関する情報を見つけようとしたときに、以下のようにラッチとロックについて述べたブログが1つ見つかりました。

enter image description here

このブログを読んだ後、気になることが1つあります。アプリがリクエストを送信すると、SQLサーバーはまずバッファキャッシュ内の情報を検索し、ページがバッファキャッシュ内にない場合は、情報をアプリに送信する前に、ページをディスクから読み取り、バッファキャッシュに配置します。ラッチとロックが同じページを更新する2つのスレッドを回避する必要があると述べた上記のスクリーンショットに基づく私の質問。基本的に、SQLサーバーに送られるすべての要求は最初にバッファーキャッシュに送られます。バッファーキャッシュ内のページが更新でビジーな場合、別のスレッドは待機する必要があります。ページが既にメモリ内にあるため、ディスクには戻りません。次に、すべてのリクエストがメモリを通じて行われ、ページを保護するためのラッチがあるため、ロックの目的は何ですか

2
jack

私の意見では、違いを非常に明確に説明しているので、(奇妙なことに、スクリーンショットとして)あなたが含めた引用であなたが理解できないことは本当に理解していません。

ロックとラッチのスコープとライフサイクルは異なります。ロックは、データベースの物理モデル要素と呼ばれるもの(テーブル、行、インデックスエントリ)に適用されます。ラッチは、SQLステートメントの実行時またはハウスキーピングタスクの実行時にデータベースサーバーが使用するさまざまなメモリ構造を保護します。

トランザクションは、処理中のオブジェクトに対して1つ、複数、またはまったくロックを保持しない場合があります。これは、他のトランザクションに、それらのオブジェクトへのアクセス権を通知します。ロックによって保護されたオブジェクトは「メモリ内」にある必要はありません。たとえば、テーブルレベルのロックで保護されているテーブルでは、バッファプールにページが存在しない場合もあります。

ワーカースレッドは、同時に実行されている他の同時実行スレッド(同じトランザクション内、他のトランザクション内、またはいくつかのサーバーバックグラウンドプロセスのためにタスクを実行している可能性がある)を厳密に防止するラッチを取得および解放します特定のメモリ領域へのアクセス。たとえば、2つのトランザクションが同じバッファプールページの異なる行のロックを保持する場合があります。これは、ページ全体がすべてのリーダーとライターに対して一貫性を保つページラッチがなければ、それらの行がそれぞれの行に同時にアクセスすることを妨げません。 。そして、レイジーライタープロセスがあります。このプロセスでは、これらのロックを気にする必要はありませんが、一貫性のあるページをディスクに書き込む前にラッチを取得する必要があります。

つまり、ロックはトランザクション同期メカニズムであり、ラッチはプロセスまたはスレッドの同期に役立ちます。

6
mustaccio