web-dev-qa-db-ja.com

データベースへの同時アクセスのコンテキストでのロックとラッチの違いは何ですか?

私は同時Bツリーに関する論文を理解しようとしています。著者はラッチとロックを述べており、ラッチには「ロックマネージャー」が不要であると述べています。私は2日間、これら2つの違いを理解しようと努めてきました。

Googleの結果:

「ロックは、データの論理的な一貫性を保証します。ロックは、長期間保持されるロックテーブル(2PLなど)とデッドロック検出メカニズムの一部を介して実装されます。

ラッチはセマフォに似ています。トランザクションレベルでは表示されないデータとリソースの物理的な整合性を保証します。」

しかし、私はまだかなり混乱しています。誰かがこれについて詳しく説明できますか?そして、ロックマネージャは正確には何をしますか?

前もって感謝します。

37
Viele

CMU 15-721(2016年春)、講義6のプレゼンテーション、スライド25と26から引用Bツリーロックテクニックの調査、Goetz著グレーフ:

ロック
→インデックスの論理コンテンツを他のトランザクションから保護します。
→txn期間保持されます。
→変更をロールバックできる必要があります。

ラッチ
→インデックスの内部データ構造の重要なセクションを他のスレッドから保護します。
→運用期間中開催されます。
→変更をロールバックできる必要はありません。

Locks and latches

31
user454322

それは本当にあなたのDBMSに依存しますが、これはOracleのための良い説明です。

http://www.dba-Oracle.com/t_lru_latches.htm

ラッチは、RAMメモリ構造のロックのようなもので、同時アクセスを防止し、カーネルコードのシリアル実行を確実にします。LRU(最も最近使用されていない)ラッチは、バッファを検索、追加、または削除するときに使用されますバッファキャッシュ。一度に1つのプロセスでのみ実行できるアクション。

10
Matt Rogish

ラッチの別名は「スピンロック」です。これは、ビットがゼロになるまでの単純な「whileループ」です(実装によって異なります)。ラッチが使用できない間は、実行スレッドがスリープ状態になることはありません。キューはありません。スピンロックは、短時間のメモリオブジェクトのロックに役立ちますが、長時間保持すると無駄になります。ウィキペディアの "Spinlock"記事を参照してください

ロックは通常システムによってサポートされており、ロックが取得された場合、スレッドはスリープ状態になるため、プロセッサリソースを消費しません。各ロックは、中断されたすべてのスレッドの内部キューを保持します。

ロックマネージャーは、同時実行をサポートするために、重いロックと同じようにスピンロックを提供できるサブシステムです。

ラッチとロックについてのTom Kyteによる の記事も参照してください

5
vim

以下はSQL Serverの立場からの抜粋です。

ラッチは、短期間の軽量同期オブジェクトです。ロックとは異なり、ラッチは論理トランザクション全体まで保持されません。 pageの操作のみを保持します。

ラッチは、エンジンで複数のスレッドの同期(たとえば、テーブルへの挿入の試行)に使用されます。ラッチは開発者やアプリケーション用ではありません-エンジンがタスクを実行するためのものです。ラッチは内部制御メカニズムです。一方、ロックは開発者とアプリケーションが制御するためのものです。ラッチは、内部メモリの一貫性を保つためのものです。ロックは、トランザクションの論理的な一貫性を保つためのものです。

ラッチによる待機は、パフォーマンスの問題を診断する上で非常に重要です。 SQL Serverでのラッチ競合の診断と解決-ホワイトペーパー をご覧ください。 PAGEIOLATCH_EXは重要な待機タイプです。

参考文献

  1. SQL Serverのラッチとパフォーマンスの問題の表示
  2. ニージャーク待機統計:PAGELATCH
  3. SQL Server内:インデックス作成とロック
3
LCJ

データベースエンティティにロックを追加できます。タプル、トランザクション。

ラッチは、下線の付いたデータ表現に追加できます。ページ識別子を特定のフレームにマップするメモリ内のページテーブル。

1
GraceMeng

ロックとラッチの違い:

このブログから引用した参照

ロックは2つの異なる接続で同じレコードを変更できないことを保証し、ラッチは適切なデータページにレコードが存在することを保証し、さらに読み取りおよび書き込み操作を行います。

ロックは論理トランザクションの一貫性を提供し、ラッチはメモリ領域の一貫性を提供します。

DBAは、異なる分離レベルを適用することでデータベースロックを制御および管理できます。ラッチの場合、SQL Serverによって管理されるため、DBAは制御できません。

1
Anvesh

Stonebrakerらによる Looking Glassを介したOLTP、およびそこで見つけたもの からの引用.

ロック。従来の2フェーズロックでは、データベース構造へのすべてのアクセスが個別のエンティティであるロックマネージャーによって管理されるため、かなりのオーバーヘッドが発生します。

ラッチング。マルチスレッドデータベースでは、アクセスする前に多くのデータ構造をラッチする必要があります。この機能を削除してシングルスレッドアプローチに移行すると、パフォーマンスに大きな影響があります。

次に、この解釈は、ロックをデータベースレベルのオブジェクトに関連付けます。行はラッチですが、ラッチはデータ構造の下位レベルで動作します。

1
Paul Carey

論文によると データベースシステムのアーキテクチャ p223。

ラッチはいくつかの点でロックと異なります。

  • ロックはロックテーブルに保持され、ハッシュテーブルを介して配置されます。ラッチは、保護するリソースの近くのメモリに常駐し、直接アドレス指定を介してアクセスされます。

  • 厳密な2PL実装では、ロックは厳密な2PLプロトコルに従います。ラッチは、特殊なケースの内部ロジックに基づいて、トランザクション中に取得または削除できます。

  • ロックの取得は、データアクセスによって完全に駆動されるため、ロックの取得の順序と有効期間は、主にアプリケーションとクエリオプティマイザーが担当します。ラッチはDBMS内の特殊なコードによって取得され、DBMSの内部コードはラッチ要求を発行して戦略的に解放されます。

  • ロックはデッドロックを生成することが許可されており、トランザクションの再起動によってロックデッドロックが検出および解決されます。ラッチデッドロックは回避する必要があります。ラッチデッドロックの発生は、DBMSコードのバグを表しています。

  • ラッチは、アトミックなハードウェア命令を使用して実装されるか、まれに、これが利用できない場合は、OSカーネルの相互排除を介して実装されます。

  • ラッチコールは最大で数十CPUサイクルかかりますが、ロックリクエストは数百のCPUサイクルを要します。

  • ロックマネージャーは、トランザクションが保持するすべてのロックを追跡し、トランザクションが例外をスローした場合に自動的にロックを解放しますが、ラッチを操作する内部DBMSルーチンは、それらを注意深く追跡し、例外処理の一部として手動クリーンアップを含める必要があります。

  • ラッチは追跡されないため、タスクが失敗した場合に自動的に解放することはできません。

1
HuihuangZhang