プライバシー&クッキー
このサイトはクッキーを使用しています。 継続することにより、あなたはそれらの使用に同意します。 Cookieの制御方法など、詳細についてはこちらをご覧ください。
この記事は、Oracle Performance Tuningシリーズの一部であり、Oracleのロック機構について説明するために作成されています。
ロックは、リソースへのアクセスを取得するために保持する必要があるリソースです。 エンキューとラッチ:オラクルはロックの二つの種類を持って、我々は今、個別にこれらのロック機構に焦点を当てます。
エンキュー
エンキューは、共有リソース(テーブル、行、ジョブ、redoスレッドなど)へのアクセスを管理するための高度なロックです。 エンキューは、異なるレベル/モードで要求することができます:
- Null
- Row share
- Row exclusive
- Share
- Share row exclusive
- Exclusive
- Exclusive
セッションが共有モードでエンキューを保持している場合、他のセッションも共有モードを取ることができます。共有モードでのエンキュー(同じリソースの場合)。 セッションが排他モードでエンキューを保持している場合、それを取得したい他のセッションは、どのレベルで独立して待機する必要があります。
セッションでアクセスが必要な場合は、ロック構造を取得し、特定のレベル(モード)でリソースへのアクセスを取得する要求を行います。 ロック構造は、OWNER(エンキューが取得可能な場合)、WAITER(セッションがエンキューの取得を待っている場合)、CONVERTER(セッションがあるレベルでエンキューを保持しているが、別のレベルに変換したい場合)リストと呼ばれる、リソースからハングアップする三つのリンクリストのいずれかに配置されます。
以下は、いくつかの一般的なタイプのエンキューです:-
- TM-セッションがテーブルをロックするたびに、TMエンキューが要求されます。 セッションが親表の行を削除し、子表の索引なしで参照制約(外部キー)が作成された場合、またはセッションが外部キーが参照する列を更新している場合、子表に対して共有ロックが適用されます。 別のセッションが子テーブルを変更しようとすると、待機する必要があります(エンキューを行排他モードにしたいため、共有モードと互換性がないため)。
- TX–トランザクションが開始されるとすぐにTXエンキューが必要です。 トランザクションは、ロールバックセグメント番号、ロールバックセグメントのトランザクションテーブル内のスロット番号、およびスロット番号の連
- 別のセッションが要求された行をロックしている
- 二つのセッションがテーブルに同じ一意のキーを挿入しようとすると(いずれもコミットを行っていない)、最後のセッションが最初のセッションがコミットまたはロールバックを待機している。
- ブロックヘッダーには空きITL(関心のあるトランザクションリスト)はありません。
- UL-AセッションがDBMS_LOCKでロックを取得しました。リクエスト機能。
ラッチ
ラッチは、SGA内の共有データ構造を保護する低レベルのシリアル化メカニズムを提供します。 ラッチは、非常に迅速に取得して解放することができるロックの一種です。 通常、ラッチは、複数のプロセスが特定の時間に同じコードを実行するのを防ぐために使用されます。 ラッチが取得されると、デッドロックを防止するために特定のレベルで取得されます。 プロセスがあるレベルでラッチを取得すると、その後、そのレベル以下のレベルでラッチを取得することはできません(nowaitを取得しない限り)。 各ラッチに関連付けられているクリーンアップ手順は、ラッチを保持している間にプロセスが死亡した場合に呼び出されます。 この清掃は、PMONのサービスを使用して行われます。 ラッチの基礎となる実装は、特にプロセスがラッチを待機するかどうかとどのくらいの時間に関して、オペレーティングシステムに依存します。
ラッチの目的は、一度に一つのプロセスだけが構造体にアクセスできるように、共有データ構造体への同時アクセスを管理することです。 ブロックされたプロセス(他のプロセスによってラッチが既に取得されているコードの一部を実行するのを待っているプロセス)は、ラッチが解放さ Oracleは、ラッチで動作するために”test and set”のようなアトミック命令を使用します。 ラッチを設定して解放する命令はアトミックであるため、OSは1つのプロセスだけがそれを取得することを保証し、単一の命令であるため、非常に速
ラッチ要求は二つのモードで行うことができます:
- willing-to-wait:「willing-to-wait」モード要求は、ラッチが取得されるまでループし、待機し、再度要求します。
- 待機なし:”待機なし”モードでは、プロセスはラッチを要求し、使用できない場合は待機する代わりに別のラッチが要求されます。 すべてが失敗した場合にのみ、サーバープロセスは待機する必要があります。
ラッチの違い&エンキュー
ラッチとエンキューの違いの一つは、エンキューはOS固有のロック機構を使用して取得されるのに対し、ラッチはOSとは無関係に取得されることである。 エンキューは、ユーザーがロックに値を格納することを可能にします(つまり、要求しているモード)。 OSロックマネージャは、ロックされたリソースを追跡します。 プロセスが要求されたモードと互換性がなく、ロックがwaitで要求されたためにロックに許可できない場合、OSは要求しているプロセスをFIFOで処理され
ラッチとエンキューのもう一つの違いは、エンキューがウェイターのキューを維持し、順序付けされているのに対し、ラッチはそうではないことです。 ラッチを待機しているすべてのプロセスが同時に再試行します(スケジューラに依存します)。 これは、ウェイターのいずれかがラッチを取得する可能性があり、ラッチを取得しようとする最初のものが実際にそれを取得する最後のものである可能性があることを意味します。 ラッチウェイターはタイマーを使ってウェイクアップと再試行を行うか、(マルチプロセッサでのみ)ラッチで回転することは、CPUを保持し、そのラッチが短時間で解放されるのを待っていることを意味する)スピンすることができる。